code-puppy-core-plugins 0.0.64__tar.gz → 0.0.66__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.
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/PKG-INFO +1 -1
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/agent_skills/provider.py +0 -4
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/agent_skills/register_callbacks.py +2 -12
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/agent_skills/skills_menu.py +0 -15
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/chatgpt_oauth/IMAGEGEN_SKILL.md +2 -2
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/chatgpt_oauth/image_generation.py +1 -1
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/chatgpt_oauth/image_tool.py +1 -1
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/chatgpt_oauth/test_plugin.py +2 -2
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/code_puppy_agent/SKILLS_SYSTEM.md +0 -1
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/pyproject.toml +1 -1
- code_puppy_core_plugins-0.0.64/code_puppy_core_plugins/agent_skills/downloader.py +0 -392
- code_puppy_core_plugins-0.0.64/code_puppy_core_plugins/agent_skills/installer.py +0 -22
- code_puppy_core_plugins-0.0.64/code_puppy_core_plugins/agent_skills/remote_catalog.py +0 -322
- code_puppy_core_plugins-0.0.64/code_puppy_core_plugins/agent_skills/skill_catalog.py +0 -277
- code_puppy_core_plugins-0.0.64/code_puppy_core_plugins/agent_skills/skills_install_menu.py +0 -608
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/.gitignore +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/LICENSE +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/README.md +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/acp/README.md +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/acp/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/acp/agent.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/acp/bridge.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/acp/capabilities.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/acp/commands.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/acp/content.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/acp/io_delegation.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/acp/mcp_config.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/acp/permissions.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/acp/persistence.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/acp/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/acp/replay.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/acp/session.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/acp/session_config.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/acp/state.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/agent_creator_skill/SKILL.md +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/agent_creator_skill/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/agent_creator_skill/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/agent_skills/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/agent_skills/config.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/agent_skills/discovery.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/agent_skills/enabled_skills.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/agent_skills/metadata.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/agent_skills/prompt_builder.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/agent_skills/skill_commands.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/auto_continue/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/auto_continue/classifier.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/auto_continue/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/aws_bedrock/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/aws_bedrock/config.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/aws_bedrock/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/aws_bedrock/utils.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/azure_foundry/README.md +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/azure_foundry/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/azure_foundry/config.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/azure_foundry/discovery.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/azure_foundry/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/azure_foundry/token.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/azure_foundry/utils.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/background_agents/README.md +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/background_agents/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/background_agents/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/btw/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/btw/inline_view.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/btw/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/btw/side_query.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/chatgpt_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/chatgpt_oauth/config.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/chatgpt_oauth/model_catalog.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/chatgpt_oauth/oauth_flow.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/chatgpt_oauth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/chatgpt_oauth/usage.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/chatgpt_oauth/utils.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/claude_code_hooks/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/claude_code_hooks/config.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/claude_code_hooks/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/claude_code_hooks/trust.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/claude_code_oauth/README.md +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/claude_code_oauth/SETUP.md +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/claude_code_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/claude_code_oauth/config.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/claude_code_oauth/fast_mode.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/claude_code_oauth/model_filter.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/claude_code_oauth/model_provider.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/claude_code_oauth/prompt_handler.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/claude_code_oauth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/claude_code_oauth/runtime_credentials.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/claude_code_oauth/test_plugin.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/claude_code_oauth/token_refresh_heartbeat.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/claude_code_oauth/token_store.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/claude_code_oauth/utils.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/code_puppy_agent/AGENTS_AND_TOOLS.md +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/code_puppy_agent/MODELS_AND_MCP.md +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/code_puppy_agent/PLUGINS_AND_CALLBACKS.md +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/code_puppy_agent/SESSIONS_AND_HISTORY.md +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/code_puppy_agent/SKILL.md +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/code_puppy_agent/SYSTEM_PROMPT_CONFIG_AND_I18N.md +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/code_puppy_agent/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/code_puppy_agent/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/completion_notification/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/completion_notification/config.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/completion_notification/locales/en-US.json +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/completion_notification/locales/es.json +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/completion_notification/locales/fr-CA.json +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/completion_notification/notifier.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/completion_notification/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/computer_use/NativeCapture.swift +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/computer_use/README.md +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/computer_use/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/computer_use/accessibility.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/computer_use/activation.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/computer_use/backend.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/computer_use/backend_types.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/computer_use/capture.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/computer_use/commands.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/computer_use/geometry.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/computer_use/inline_image.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/computer_use/keycodes.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/computer_use/policy.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/computer_use/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/computer_use/safety.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/computer_use/settle.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/computer_use/state.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/computer_use/tools.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/context_indicator/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/context_indicator/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/context_indicator/usage.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/copilot_auth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/copilot_auth/config.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/copilot_auth/reasoning_client.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/copilot_auth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/copilot_auth/responses_stream.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/copilot_auth/utils.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/customizable_commands/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/customizable_commands/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/dbos_durable_exec/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/dbos_durable_exec/cancel.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/dbos_durable_exec/commands.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/dbos_durable_exec/config.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/dbos_durable_exec/lifecycle.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/dbos_durable_exec/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/dbos_durable_exec/runtime.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/dbos_durable_exec/startup_lock.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/dbos_durable_exec/workflow_ids.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/dbos_durable_exec/wrapper.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/destructive_command_guard/AGENTS.md +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/destructive_command_guard/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/destructive_command_guard/detector.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/destructive_command_guard/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/emoji_filter/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/emoji_filter/config.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/emoji_filter/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/emoji_filter/stripper.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/empty_html_comment_filter/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/example_custom_command/README.md +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/example_custom_command/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/file_permission_handler/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/file_permission_handler/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/flux_bootstrap/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/README.md +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/cheatsheet.md +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/pipeline.md +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/synopsis.md +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/about.md +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/address-feedback.md +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/ask.md +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/aug.md +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/auto-pilot.md +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/cheatsheet.md +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/commit.md +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/config.md +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/create-pr.md +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/exec.md +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/new.md +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/qa.md +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/rebase.md +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/review.md +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/split.md +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/squash-commits.md +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/status.md +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/tests.md +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_about.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_cheatsheet.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_status.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/flux_bootstrap/installer.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/flux_bootstrap/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/force_push_guard/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/force_push_guard/detector.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/force_push_guard/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/fork/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/fork/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/frontend_emitter/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/frontend_emitter/emitter.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/frontend_emitter/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/frontend_emitter/session_context.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/grok_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/grok_oauth/config.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/grok_oauth/oauth_flow.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/grok_oauth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/grok_oauth/utils.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/herdr/README.md +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/herdr/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/herdr/client.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/herdr/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/herdr/reporter.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/herdr/restore.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/herdr/smoke.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/herdr/sources.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/hook_creator/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/hook_creator/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/hook_manager/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/hook_manager/config.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/hook_manager/hooks_menu.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/hook_manager/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/hook_manager/trust_handler.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/logfire_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/logfire_oauth/oauth.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/logfire_oauth/query_tool.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/logfire_oauth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/logfire_sessions/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/logfire_sessions/mirror.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/logfire_sessions/query.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/logfire_sessions/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/logfire_sessions/sync.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/mcp_binding_prompt/README.md +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/mcp_binding_prompt/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/mcp_binding_prompt/custom_install.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/mcp_binding_prompt/http_form.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/mcp_binding_prompt/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/meta_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/meta_oauth/config.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/meta_oauth/oauth_flow.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/meta_oauth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/meta_oauth/utils.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/namespace_skill_search/README.md +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/namespace_skill_search/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/namespace_skill_search/namespaces.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/namespace_skill_search/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/namespace_skill_search/search_tool.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/no_tools/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/no_tools/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/oauth_pasteback.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/oauth_puppy_html.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/obsidian_agent/README.md +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/obsidian_agent/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/obsidian_agent/agent_obsidian.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/obsidian_agent/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/ollama/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/ollama/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/ollama_setup/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/ollama_setup/completer.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/ollama_setup/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/openrouter_oauth/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/openrouter_oauth/config.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/openrouter_oauth/oauth_flow.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/openrouter_oauth/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/openrouter_oauth/test_plugin.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/plugin_list/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/plugin_list/plugin_contributions.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/plugin_list/plugin_meta.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/plugin_list/plugin_text_utils.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/plugin_list/plugins_menu.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/plugin_list/plugins_menu_render.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/plugin_list/project_trust_flow.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/plugin_list/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/pop_command/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/pop_command/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/profiles/README.md +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/profiles/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/profiles/config.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/profiles/locales/en-US.json +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/profiles/menu.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/profiles/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/prompt_newline/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/prompt_newline/config.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/prompt_newline/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/prune/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/prune/prune_menu.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/prune/prune_model.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/prune/prune_render.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/prune/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/puppy_kennel/README.md +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/puppy_kennel/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/puppy_kennel/commands.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/puppy_kennel/config.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/puppy_kennel/kennel.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/puppy_kennel/packer.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/puppy_kennel/recorder.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/puppy_kennel/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/puppy_kennel/retriever.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/puppy_kennel/schema.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/puppy_kennel/state.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/puppy_kennel/tools.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/puppy_kennel/wings.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/puppy_spinner/README.md +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/puppy_spinner/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/puppy_spinner/builtin_frames.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/puppy_spinner/commands.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/puppy_spinner/picker.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/puppy_spinner/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/puppy_spinner/spinners.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/qa_kitten_skill/SKILL.md +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/qa_kitten_skill/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/qa_kitten_skill/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/quick_resume/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/quick_resume/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/review_pr/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/review_pr/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/session_namer/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/session_namer/namer.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/session_namer/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/spill/LICENSE.deepseek +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/spill/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/spill/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/spill/store.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/stack_dump/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/stack_dump/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/statusline/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/statusline/config.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/statusline/payload.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/statusline/prompt_patch.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/statusline/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/statusline/runner.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/statusline/statusline_command.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/steer_queue/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/steer_queue/queue_menu.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/steer_queue/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/subagent_panel/README.md +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/subagent_panel/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/subagent_panel/coalesce_patch.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/subagent_panel/panel_render.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/subagent_panel/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/subagent_panel/resume_repaint.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/subagent_panel/state.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/switch_agent_resume/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/switch_agent_resume/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/termflow_tui.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/theme/README.md +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/theme/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/theme/bundled_palettes.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/theme/content_styles.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/theme/osc_palette.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/theme/picker.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/theme/prompt_toolkit_theme.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/theme/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/theme/rich_themes.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/theme/themes.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/timestamp_heartbeat/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/timestamp_heartbeat/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/token_ratio_learner/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/token_ratio_learner/ratios.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/token_ratio_learner/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/universal_constructor/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/universal_constructor/models.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/universal_constructor/provider.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/universal_constructor/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/universal_constructor/registry.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/universal_constructor/sandbox.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/web_retriever_skill/SKILL.md +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/web_retriever_skill/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/web_retriever_skill/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/wiggum/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/wiggum/goal_runs.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/wiggum/judge.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/wiggum/judge_config.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/wiggum/judges_menu.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/wiggum/register_callbacks.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/wiggum/state.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/yolo_cli/__init__.py +0 -0
- {code_puppy_core_plugins-0.0.64 → code_puppy_core_plugins-0.0.66}/code_puppy_core_plugins/yolo_cli/register_callbacks.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: code-puppy-core-plugins
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.66
|
|
4
4
|
Summary: Official plugin bundle for Code Puppy
|
|
5
5
|
Project-URL: Repository, https://github.com/mpfaffenberger/code_puppy_core_plugins
|
|
6
6
|
Project-URL: Homepage, https://github.com/mpfaffenberger/code_puppy_core_plugins
|
|
@@ -8,7 +8,6 @@ from typing import Any, List, Optional, Set
|
|
|
8
8
|
from .config import get_disabled_skills, get_skills_enabled
|
|
9
9
|
from .enabled_skills import iter_enabled_skills, list_enabled_skill_metadata
|
|
10
10
|
from .metadata import get_skill_resources, load_full_skill_content
|
|
11
|
-
from .skill_catalog import catalog
|
|
12
11
|
|
|
13
12
|
|
|
14
13
|
class AgentSkillsProvider:
|
|
@@ -45,8 +44,5 @@ class AgentSkillsProvider:
|
|
|
45
44
|
def get_skill_resources(self, skill_path: Path) -> List[Path]:
|
|
46
45
|
return get_skill_resources(skill_path)
|
|
47
46
|
|
|
48
|
-
def get_catalog_skill_ids(self) -> List[str]:
|
|
49
|
-
return [entry.id for entry in catalog.get_all()]
|
|
50
|
-
|
|
51
47
|
|
|
52
48
|
skill_provider = AgentSkillsProvider()
|
|
@@ -111,7 +111,7 @@ def _skills_command_help() -> List[Tuple[str, str]]:
|
|
|
111
111
|
from .skill_commands import skill_command_help
|
|
112
112
|
|
|
113
113
|
entries: List[Tuple[str, str]] = [
|
|
114
|
-
("skills", "Manage agent skills – browse, enable, disable
|
|
114
|
+
("skills", "Manage agent skills – browse, enable, disable"),
|
|
115
115
|
("skill", "Alias for /skills"),
|
|
116
116
|
]
|
|
117
117
|
# Append per-skill commands so they show up in /help & tab-completion.
|
|
@@ -125,7 +125,6 @@ def _handle_skills_command(command: str, name: str) -> Optional[Any]:
|
|
|
125
125
|
Sub-commands:
|
|
126
126
|
/skills – Launch interactive TUI menu
|
|
127
127
|
/skills list – Quick text list of all skills
|
|
128
|
-
/skills install – Browse & install from remote catalog
|
|
129
128
|
/skills enable – Enable skills integration globally
|
|
130
129
|
/skills disable – Disable skills integration globally
|
|
131
130
|
/skills toggle – Toggle skills integration globally
|
|
@@ -200,14 +199,6 @@ def _handle_skills_command(command: str, name: str) -> Optional[Any]:
|
|
|
200
199
|
emit_info("")
|
|
201
200
|
return True
|
|
202
201
|
|
|
203
|
-
elif subcommand == "install":
|
|
204
|
-
from code_puppy_core_plugins.agent_skills.skills_install_menu import (
|
|
205
|
-
run_skills_install_menu,
|
|
206
|
-
)
|
|
207
|
-
|
|
208
|
-
run_skills_install_menu()
|
|
209
|
-
return True
|
|
210
|
-
|
|
211
202
|
elif subcommand == "enable":
|
|
212
203
|
set_skills_enabled(True)
|
|
213
204
|
emit_success("\u2705 Skills integration enabled globally")
|
|
@@ -274,7 +265,6 @@ def _handle_skills_command(command: str, name: str) -> Optional[Any]:
|
|
|
274
265
|
elif subcommand == "help":
|
|
275
266
|
emit_info("Available /skills subcommands:")
|
|
276
267
|
emit_info(" /skills list - List all installed skills")
|
|
277
|
-
emit_info(" /skills install - Browse & install from catalog")
|
|
278
268
|
emit_info(" /skills enable - Enable skills integration globally")
|
|
279
269
|
emit_info(" /skills disable - Disable skills integration globally")
|
|
280
270
|
emit_info(" /skills toggle - Toggle skills integration globally")
|
|
@@ -288,7 +278,7 @@ def _handle_skills_command(command: str, name: str) -> Optional[Any]:
|
|
|
288
278
|
else:
|
|
289
279
|
emit_error(f"Unknown subcommand: {subcommand}")
|
|
290
280
|
emit_info(
|
|
291
|
-
"Usage: /skills [list|
|
|
281
|
+
"Usage: /skills [list|enable|disable|toggle|frontmatter|refresh|help]"
|
|
292
282
|
)
|
|
293
283
|
return True
|
|
294
284
|
|
|
@@ -186,8 +186,6 @@ class SkillsMenu:
|
|
|
186
186
|
lines.append(("", "Add Dir "))
|
|
187
187
|
lines.append(("class:tui.help-key", " Ctrl+D "))
|
|
188
188
|
lines.append(("", "Show Dirs\n"))
|
|
189
|
-
lines.append(("class:tui.help-key", " i "))
|
|
190
|
-
lines.append(("", "Install from catalog\n"))
|
|
191
189
|
lines.append(("class:tui.help-key", " r "))
|
|
192
190
|
lines.append(("", "Refresh "))
|
|
193
191
|
lines.append(("class:tui.help-key", " q "))
|
|
@@ -347,9 +345,6 @@ class SkillsMenu:
|
|
|
347
345
|
elif key == "ctrl-d":
|
|
348
346
|
self.result = "show_directories"
|
|
349
347
|
return True
|
|
350
|
-
elif key == "i":
|
|
351
|
-
self.result = "install"
|
|
352
|
-
return True
|
|
353
348
|
elif key in ("q", "escape", "ctrl-c"):
|
|
354
349
|
self.result = "quit"
|
|
355
350
|
return True
|
|
@@ -478,16 +473,6 @@ def show_skills_menu() -> bool:
|
|
|
478
473
|
# Re-run the menu
|
|
479
474
|
continue
|
|
480
475
|
|
|
481
|
-
elif result == "install":
|
|
482
|
-
from code_puppy_core_plugins.agent_skills.skills_install_menu import (
|
|
483
|
-
run_skills_install_menu,
|
|
484
|
-
)
|
|
485
|
-
|
|
486
|
-
install_result = run_skills_install_menu()
|
|
487
|
-
if install_result:
|
|
488
|
-
changes_made = True
|
|
489
|
-
continue # Re-run the skills menu after install
|
|
490
|
-
|
|
491
476
|
elif result == "changed":
|
|
492
477
|
changes_made = True
|
|
493
478
|
break
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: codex-imagegen
|
|
3
|
-
description: Generate raster images with gpt-image-2 through Codex OAuth. Activate when the user asks to create a photo, illustration, icon, sprite, texture, product image, banner, or other raster artwork.
|
|
3
|
+
description: Generate raster images with gpt-image-2.1 through Codex OAuth. Activate when the user asks to create a photo, illustration, icon, sprite, texture, product image, banner, or other raster artwork.
|
|
4
4
|
version: "1.0"
|
|
5
5
|
author: code-puppy
|
|
6
6
|
tags:
|
|
@@ -13,7 +13,7 @@ tags:
|
|
|
13
13
|
# Codex Image Generation
|
|
14
14
|
|
|
15
15
|
Use the `codex_imagegen` tool when the user asks you to create raster artwork.
|
|
16
|
-
The tool uses `gpt-image-2` through the user's existing Codex OAuth session,
|
|
16
|
+
The tool uses `gpt-image-2.1` through the user's existing Codex OAuth session,
|
|
17
17
|
saves the resulting PNG, and displays it inline when iTerm2 supports doing so.
|
|
18
18
|
|
|
19
19
|
## Decision rules
|
|
@@ -46,7 +46,7 @@ from code_puppy.i18n import t
|
|
|
46
46
|
from .config import CHATGPT_OAUTH_CONFIG
|
|
47
47
|
from .utils import get_valid_access_token, load_stored_tokens
|
|
48
48
|
|
|
49
|
-
_IMAGE_MODEL = "gpt-image-2"
|
|
49
|
+
_IMAGE_MODEL = "gpt-image-2.1"
|
|
50
50
|
_REQUEST_TIMEOUT_SECONDS = 180
|
|
51
51
|
|
|
52
52
|
# Guard against pathologically large payloads: references are inlined as base64
|
|
@@ -25,7 +25,7 @@ def register_codex_imagegen(agent: Any) -> None:
|
|
|
25
25
|
prompt: str,
|
|
26
26
|
reference_images: list[str] | None = None,
|
|
27
27
|
) -> dict[str, Any]:
|
|
28
|
-
"""Generate a raster image using gpt-image-2 and Codex OAuth.
|
|
28
|
+
"""Generate a raster image using gpt-image-2.1 and Codex OAuth.
|
|
29
29
|
|
|
30
30
|
Use this when the user asks you to create a photo, illustration, icon,
|
|
31
31
|
sprite, texture, product image, banner, or other raster artwork. Write a
|
|
@@ -44,7 +44,7 @@ def test_codex_image_generation_posts_codex_payload(tmp_path):
|
|
|
44
44
|
assert call.kwargs["json"] == {
|
|
45
45
|
"prompt": "a red fox",
|
|
46
46
|
"background": "auto",
|
|
47
|
-
"model": "gpt-image-2",
|
|
47
|
+
"model": "gpt-image-2.1",
|
|
48
48
|
"quality": "auto",
|
|
49
49
|
"size": "auto",
|
|
50
50
|
}
|
|
@@ -83,7 +83,7 @@ def test_codex_image_generation_with_references_posts_edits_payload(tmp_path):
|
|
|
83
83
|
payload = call.kwargs["json"]
|
|
84
84
|
assert payload["images"] == [{"image_url": f"data:image/png;base64,{expected_b64}"}]
|
|
85
85
|
assert payload["prompt"] == "a red fox"
|
|
86
|
-
assert payload["model"] == "gpt-image-2"
|
|
86
|
+
assert payload["model"] == "gpt-image-2.1"
|
|
87
87
|
# `background` is not accepted by the edits endpoint.
|
|
88
88
|
assert "background" not in payload
|
|
89
89
|
|
|
@@ -66,7 +66,6 @@ real path in the repo rather than expecting it to appear as a
|
|
|
66
66
|
| `/skills list` | Text list of all skills |
|
|
67
67
|
| `/skills enable` / `disable` | Toggle skills globally |
|
|
68
68
|
| `/skills frontmatter on/off` | Toggle skill summaries in system prompt |
|
|
69
|
-
| `/skills install` | Browse & install from remote catalog |
|
|
70
69
|
|
|
71
70
|
---
|
|
72
71
|
|
|
@@ -1,392 +0,0 @@
|
|
|
1
|
-
"""Remote skill downloader/installer.
|
|
2
|
-
|
|
3
|
-
Downloads a remote skill ZIP and installs it into the local skills directory.
|
|
4
|
-
|
|
5
|
-
Security notes:
|
|
6
|
-
- Defends against zip-slip path traversal.
|
|
7
|
-
- Defends (somewhat) against zip bombs by capping total uncompressed size.
|
|
8
|
-
|
|
9
|
-
This module never raises to callers; failures are returned as InstallResult.
|
|
10
|
-
"""
|
|
11
|
-
|
|
12
|
-
from __future__ import annotations
|
|
13
|
-
|
|
14
|
-
import logging
|
|
15
|
-
import shutil
|
|
16
|
-
import tempfile
|
|
17
|
-
import zipfile
|
|
18
|
-
from pathlib import Path
|
|
19
|
-
from typing import Optional
|
|
20
|
-
|
|
21
|
-
import httpx
|
|
22
|
-
|
|
23
|
-
from code_puppy_core_plugins.agent_skills.discovery import refresh_skill_cache
|
|
24
|
-
from code_puppy_core_plugins.agent_skills.installer import InstallResult
|
|
25
|
-
|
|
26
|
-
logger = logging.getLogger(__name__)
|
|
27
|
-
|
|
28
|
-
_DEFAULT_SKILLS_DIR = Path.home() / ".code_puppy" / "skills"
|
|
29
|
-
_MAX_UNCOMPRESSED_BYTES = 50 * 1024 * 1024 # 50MB
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
def _zip_entry_parts(name: str) -> list[str]:
|
|
33
|
-
"""Return safe-ish path parts for a zip entry.
|
|
34
|
-
|
|
35
|
-
Zip files use POSIX-style separators, but malicious zips sometimes include
|
|
36
|
-
backslashes. We normalize to '/' then split.
|
|
37
|
-
"""
|
|
38
|
-
|
|
39
|
-
normalized = name.replace("\\", "/")
|
|
40
|
-
return [part for part in normalized.split("/") if part not in {"", "."}]
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
def _safe_rmtree(path: Path) -> bool:
|
|
44
|
-
"""Remove a directory tree, logging errors instead of raising."""
|
|
45
|
-
|
|
46
|
-
try:
|
|
47
|
-
if not path.exists():
|
|
48
|
-
return True
|
|
49
|
-
shutil.rmtree(path)
|
|
50
|
-
return True
|
|
51
|
-
except Exception as e:
|
|
52
|
-
logger.warning(f"Failed to remove directory {path}: {e}")
|
|
53
|
-
return False
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
def _download_to_file(url: str, dest: Path) -> bool:
|
|
57
|
-
"""Download a URL to a local file path with streaming."""
|
|
58
|
-
|
|
59
|
-
headers = {
|
|
60
|
-
"Accept": "application/zip, application/octet-stream, */*",
|
|
61
|
-
"User-Agent": "code-puppy/skill-downloader",
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
try:
|
|
65
|
-
dest.parent.mkdir(parents=True, exist_ok=True)
|
|
66
|
-
|
|
67
|
-
with httpx.Client(timeout=30, headers=headers, follow_redirects=True) as client:
|
|
68
|
-
with client.stream("GET", url) as response:
|
|
69
|
-
response.raise_for_status()
|
|
70
|
-
|
|
71
|
-
with dest.open("wb") as f:
|
|
72
|
-
for chunk in response.iter_bytes():
|
|
73
|
-
if chunk:
|
|
74
|
-
f.write(chunk)
|
|
75
|
-
|
|
76
|
-
logger.info(f"Downloaded skill zip to {dest}")
|
|
77
|
-
return True
|
|
78
|
-
|
|
79
|
-
except httpx.HTTPStatusError as e:
|
|
80
|
-
logger.warning(
|
|
81
|
-
"Skill download failed with HTTP status: "
|
|
82
|
-
f"{e.response.status_code} {e.response.reason_phrase}"
|
|
83
|
-
)
|
|
84
|
-
return False
|
|
85
|
-
except (httpx.ConnectError, httpx.TimeoutException, httpx.NetworkError) as e:
|
|
86
|
-
logger.warning(f"Skill download network failure: {e}")
|
|
87
|
-
return False
|
|
88
|
-
except Exception as e:
|
|
89
|
-
logger.exception(f"Unexpected error downloading {url}: {e}")
|
|
90
|
-
return False
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
def _is_within_directory(base_dir: Path, candidate: Path) -> bool:
|
|
94
|
-
"""Check that a path is safely contained within a directory."""
|
|
95
|
-
|
|
96
|
-
try:
|
|
97
|
-
base_resolved = base_dir.resolve()
|
|
98
|
-
candidate_resolved = candidate.resolve()
|
|
99
|
-
candidate_resolved.relative_to(base_resolved)
|
|
100
|
-
return True
|
|
101
|
-
except Exception:
|
|
102
|
-
return False
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
def _validate_zip_safety(zf: zipfile.ZipFile) -> Optional[str]:
|
|
106
|
-
"""Return an error message if unsafe, otherwise None."""
|
|
107
|
-
|
|
108
|
-
total_uncompressed = 0
|
|
109
|
-
|
|
110
|
-
for info in zf.infolist():
|
|
111
|
-
# Directory entries are fine.
|
|
112
|
-
if info.is_dir():
|
|
113
|
-
continue
|
|
114
|
-
|
|
115
|
-
total_uncompressed += int(info.file_size or 0)
|
|
116
|
-
if total_uncompressed > _MAX_UNCOMPRESSED_BYTES:
|
|
117
|
-
return (
|
|
118
|
-
"ZIP appears too large when uncompressed "
|
|
119
|
-
f"(>{_MAX_UNCOMPRESSED_BYTES} bytes)"
|
|
120
|
-
)
|
|
121
|
-
|
|
122
|
-
# Basic zip-slip protection: reject absolute paths and parent traversals.
|
|
123
|
-
name = info.filename
|
|
124
|
-
normalized = name.replace("\\", "/")
|
|
125
|
-
if normalized.startswith("/"):
|
|
126
|
-
return f"Unsafe zip entry path (absolute): {name}"
|
|
127
|
-
|
|
128
|
-
parts = _zip_entry_parts(name)
|
|
129
|
-
if ".." in parts:
|
|
130
|
-
return f"Unsafe zip entry path (traversal): {name}"
|
|
131
|
-
|
|
132
|
-
return None
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
def _safe_extract_zip(zf: zipfile.ZipFile, extract_dir: Path) -> bool:
|
|
136
|
-
"""Safely extract zip contents into extract_dir."""
|
|
137
|
-
|
|
138
|
-
try:
|
|
139
|
-
extract_dir.mkdir(parents=True, exist_ok=True)
|
|
140
|
-
|
|
141
|
-
for info in zf.infolist():
|
|
142
|
-
parts = _zip_entry_parts(info.filename)
|
|
143
|
-
|
|
144
|
-
# Skip weird metadata folders.
|
|
145
|
-
if parts and parts[0] == "__MACOSX":
|
|
146
|
-
continue
|
|
147
|
-
|
|
148
|
-
dest_path = extract_dir.joinpath(*parts)
|
|
149
|
-
|
|
150
|
-
if not _is_within_directory(extract_dir, dest_path):
|
|
151
|
-
logger.warning(
|
|
152
|
-
f"Blocked zip entry outside extraction dir: {info.filename}"
|
|
153
|
-
)
|
|
154
|
-
return False
|
|
155
|
-
|
|
156
|
-
if info.is_dir():
|
|
157
|
-
dest_path.mkdir(parents=True, exist_ok=True)
|
|
158
|
-
continue
|
|
159
|
-
|
|
160
|
-
dest_path.parent.mkdir(parents=True, exist_ok=True)
|
|
161
|
-
|
|
162
|
-
with zf.open(info, "r") as src, dest_path.open("wb") as dst:
|
|
163
|
-
shutil.copyfileobj(src, dst)
|
|
164
|
-
|
|
165
|
-
return True
|
|
166
|
-
|
|
167
|
-
except Exception as e:
|
|
168
|
-
logger.exception(f"Failed to extract zip safely: {e}")
|
|
169
|
-
return False
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
def _determine_extracted_root(extract_dir: Path) -> Optional[Path]:
|
|
173
|
-
"""Determine where the skill files live inside an extracted zip.
|
|
174
|
-
|
|
175
|
-
Supports:
|
|
176
|
-
- Files at the zip root
|
|
177
|
-
- Files inside a single top-level folder
|
|
178
|
-
|
|
179
|
-
Returns:
|
|
180
|
-
Path to the directory containing SKILL.md, or None.
|
|
181
|
-
"""
|
|
182
|
-
|
|
183
|
-
try:
|
|
184
|
-
if (extract_dir / "SKILL.md").is_file():
|
|
185
|
-
return extract_dir
|
|
186
|
-
|
|
187
|
-
children = [p for p in extract_dir.iterdir() if p.name != "__MACOSX"]
|
|
188
|
-
dirs = [p for p in children if p.is_dir()]
|
|
189
|
-
files = [p for p in children if p.is_file()]
|
|
190
|
-
|
|
191
|
-
# If it's root-level but SKILL.md missing, no good.
|
|
192
|
-
if files:
|
|
193
|
-
return None
|
|
194
|
-
|
|
195
|
-
if len(dirs) == 1:
|
|
196
|
-
candidate = dirs[0]
|
|
197
|
-
if (candidate / "SKILL.md").is_file():
|
|
198
|
-
return candidate
|
|
199
|
-
|
|
200
|
-
return None
|
|
201
|
-
|
|
202
|
-
except Exception as e:
|
|
203
|
-
logger.warning(f"Failed to inspect extracted zip directory {extract_dir}: {e}")
|
|
204
|
-
return None
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
def _stage_normalized_install(
|
|
208
|
-
extracted_root: Path, skill_name: str, staging_base: Path
|
|
209
|
-
) -> Optional[Path]:
|
|
210
|
-
"""Copy extracted content into staging_base/<skill_name>."""
|
|
211
|
-
|
|
212
|
-
try:
|
|
213
|
-
staged_skill_dir = staging_base / skill_name
|
|
214
|
-
if staged_skill_dir.exists():
|
|
215
|
-
_safe_rmtree(staged_skill_dir)
|
|
216
|
-
|
|
217
|
-
shutil.copytree(extracted_root, staged_skill_dir)
|
|
218
|
-
|
|
219
|
-
if not (staged_skill_dir / "SKILL.md").is_file():
|
|
220
|
-
logger.warning(
|
|
221
|
-
f"Staged skill is missing SKILL.md: {(staged_skill_dir / 'SKILL.md')}"
|
|
222
|
-
)
|
|
223
|
-
return None
|
|
224
|
-
|
|
225
|
-
return staged_skill_dir
|
|
226
|
-
|
|
227
|
-
except Exception as e:
|
|
228
|
-
logger.exception(f"Failed to stage normalized install for {skill_name}: {e}")
|
|
229
|
-
return None
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
def download_and_install_skill(
|
|
233
|
-
skill_name: str,
|
|
234
|
-
download_url: str,
|
|
235
|
-
target_dir: Optional[Path] = None,
|
|
236
|
-
force: bool = False,
|
|
237
|
-
) -> InstallResult:
|
|
238
|
-
"""Download and install a remote skill zip.
|
|
239
|
-
|
|
240
|
-
Args:
|
|
241
|
-
skill_name: Skill name (directory name under target_dir).
|
|
242
|
-
download_url: Absolute URL to the skill .zip.
|
|
243
|
-
target_dir: Base skills directory. Defaults to ~/.code_puppy/skills.
|
|
244
|
-
force: If True, delete any existing install first.
|
|
245
|
-
|
|
246
|
-
Returns:
|
|
247
|
-
InstallResult indicating success/failure.
|
|
248
|
-
"""
|
|
249
|
-
|
|
250
|
-
skill_name = skill_name.strip()
|
|
251
|
-
if not skill_name:
|
|
252
|
-
return InstallResult(success=False, message="skill_name is required")
|
|
253
|
-
|
|
254
|
-
# Prevent path traversal via skill_name.
|
|
255
|
-
if Path(skill_name).name != skill_name or skill_name in {".", ".."}:
|
|
256
|
-
return InstallResult(
|
|
257
|
-
success=False, message="skill_name must be a simple directory name"
|
|
258
|
-
)
|
|
259
|
-
|
|
260
|
-
base_dir = target_dir or _DEFAULT_SKILLS_DIR
|
|
261
|
-
skill_dir = base_dir / skill_name
|
|
262
|
-
|
|
263
|
-
try:
|
|
264
|
-
if skill_dir.exists():
|
|
265
|
-
if not force:
|
|
266
|
-
return InstallResult(
|
|
267
|
-
success=False,
|
|
268
|
-
message=f"Skill already installed at {skill_dir} (use force=True to reinstall)",
|
|
269
|
-
installed_path=skill_dir,
|
|
270
|
-
)
|
|
271
|
-
|
|
272
|
-
logger.info(
|
|
273
|
-
f"Force reinstall enabled; removing existing skill at {skill_dir}"
|
|
274
|
-
)
|
|
275
|
-
if not _safe_rmtree(skill_dir):
|
|
276
|
-
return InstallResult(
|
|
277
|
-
success=False,
|
|
278
|
-
message=f"Failed to remove existing skill directory: {skill_dir}",
|
|
279
|
-
installed_path=skill_dir,
|
|
280
|
-
)
|
|
281
|
-
|
|
282
|
-
base_dir.mkdir(parents=True, exist_ok=True)
|
|
283
|
-
|
|
284
|
-
with tempfile.TemporaryDirectory(prefix="code_puppy_skill_") as tmp:
|
|
285
|
-
tmp_dir = Path(tmp)
|
|
286
|
-
tmp_zip = tmp_dir / f"{skill_name}.zip"
|
|
287
|
-
extract_dir = tmp_dir / "extracted"
|
|
288
|
-
staging_dir = tmp_dir / "staging"
|
|
289
|
-
staging_dir.mkdir(parents=True, exist_ok=True)
|
|
290
|
-
|
|
291
|
-
if not _download_to_file(download_url, tmp_zip):
|
|
292
|
-
return InstallResult(
|
|
293
|
-
success=False,
|
|
294
|
-
message=f"Failed to download skill zip from {download_url}",
|
|
295
|
-
)
|
|
296
|
-
|
|
297
|
-
try:
|
|
298
|
-
with zipfile.ZipFile(tmp_zip, "r") as zf:
|
|
299
|
-
unsafe_reason = _validate_zip_safety(zf)
|
|
300
|
-
if unsafe_reason:
|
|
301
|
-
logger.warning(
|
|
302
|
-
f"Rejected unsafe zip for {skill_name}: {unsafe_reason}"
|
|
303
|
-
)
|
|
304
|
-
return InstallResult(
|
|
305
|
-
success=False,
|
|
306
|
-
message=f"Rejected unsafe zip: {unsafe_reason}",
|
|
307
|
-
)
|
|
308
|
-
|
|
309
|
-
if not _safe_extract_zip(zf, extract_dir):
|
|
310
|
-
return InstallResult(
|
|
311
|
-
success=False,
|
|
312
|
-
message="Failed to extract skill zip safely",
|
|
313
|
-
)
|
|
314
|
-
except zipfile.BadZipFile:
|
|
315
|
-
logger.warning(f"Downloaded file is not a valid zip: {tmp_zip}")
|
|
316
|
-
return InstallResult(
|
|
317
|
-
success=False, message="Downloaded file is not a valid zip"
|
|
318
|
-
)
|
|
319
|
-
except Exception as e:
|
|
320
|
-
logger.exception(f"Failed to open/extract zip for {skill_name}: {e}")
|
|
321
|
-
return InstallResult(success=False, message="Failed to extract zip")
|
|
322
|
-
|
|
323
|
-
extracted_root = _determine_extracted_root(extract_dir)
|
|
324
|
-
if extracted_root is None:
|
|
325
|
-
logger.warning(
|
|
326
|
-
"Extracted zip layout not recognized or missing SKILL.md. "
|
|
327
|
-
f"extract_dir={extract_dir}"
|
|
328
|
-
)
|
|
329
|
-
return InstallResult(
|
|
330
|
-
success=False,
|
|
331
|
-
message="Extracted zip missing SKILL.md or has unexpected layout",
|
|
332
|
-
)
|
|
333
|
-
|
|
334
|
-
staged_skill_dir = _stage_normalized_install(
|
|
335
|
-
extracted_root=extracted_root,
|
|
336
|
-
skill_name=skill_name,
|
|
337
|
-
staging_base=staging_dir,
|
|
338
|
-
)
|
|
339
|
-
if staged_skill_dir is None:
|
|
340
|
-
return InstallResult(
|
|
341
|
-
success=False,
|
|
342
|
-
message="Failed to stage extracted skill (missing SKILL.md)",
|
|
343
|
-
)
|
|
344
|
-
|
|
345
|
-
# Move staged install into final destination.
|
|
346
|
-
try:
|
|
347
|
-
if skill_dir.exists():
|
|
348
|
-
# Shouldn't happen (handled earlier), but be safe.
|
|
349
|
-
if force:
|
|
350
|
-
_safe_rmtree(skill_dir)
|
|
351
|
-
else:
|
|
352
|
-
return InstallResult(
|
|
353
|
-
success=False,
|
|
354
|
-
message=f"Skill directory already exists: {skill_dir}",
|
|
355
|
-
installed_path=skill_dir,
|
|
356
|
-
)
|
|
357
|
-
|
|
358
|
-
shutil.move(str(staged_skill_dir), str(skill_dir))
|
|
359
|
-
except Exception as e:
|
|
360
|
-
logger.exception(f"Failed to install skill into {skill_dir}: {e}")
|
|
361
|
-
# Cleanup partial install.
|
|
362
|
-
_safe_rmtree(skill_dir)
|
|
363
|
-
return InstallResult(
|
|
364
|
-
success=False, message="Failed to move skill into place"
|
|
365
|
-
)
|
|
366
|
-
|
|
367
|
-
# Post-install verification.
|
|
368
|
-
if not (skill_dir / "SKILL.md").is_file():
|
|
369
|
-
logger.warning(f"Installed skill missing SKILL.md: {skill_dir}")
|
|
370
|
-
_safe_rmtree(skill_dir)
|
|
371
|
-
return InstallResult(
|
|
372
|
-
success=False,
|
|
373
|
-
message="Installed skill is missing SKILL.md",
|
|
374
|
-
installed_path=skill_dir,
|
|
375
|
-
)
|
|
376
|
-
|
|
377
|
-
try:
|
|
378
|
-
refresh_skill_cache()
|
|
379
|
-
except Exception as e:
|
|
380
|
-
# Cache refresh failure should not poison a successful install.
|
|
381
|
-
logger.warning(f"Skill installed but failed to refresh skill cache: {e}")
|
|
382
|
-
|
|
383
|
-
logger.info(f"Installed skill '{skill_name}' into {skill_dir}")
|
|
384
|
-
return InstallResult(
|
|
385
|
-
success=True,
|
|
386
|
-
message=f"Installed skill '{skill_name}'",
|
|
387
|
-
installed_path=skill_dir,
|
|
388
|
-
)
|
|
389
|
-
|
|
390
|
-
except Exception as e:
|
|
391
|
-
logger.exception(f"Unexpected error installing skill {skill_name}: {e}")
|
|
392
|
-
return InstallResult(success=False, message="Unexpected error installing skill")
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
"""Agent skills installation helpers.
|
|
2
|
-
|
|
3
|
-
This module currently provides the shared InstallResult type used by skill
|
|
4
|
-
installers (e.g. local installers, remote zip downloaders).
|
|
5
|
-
|
|
6
|
-
It is intentionally small so other modules can depend on a stable result shape.
|
|
7
|
-
"""
|
|
8
|
-
|
|
9
|
-
from __future__ import annotations
|
|
10
|
-
|
|
11
|
-
from dataclasses import dataclass
|
|
12
|
-
from pathlib import Path
|
|
13
|
-
from typing import Optional
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
@dataclass(frozen=True, slots=True)
|
|
17
|
-
class InstallResult:
|
|
18
|
-
"""Result of a skill install attempt."""
|
|
19
|
-
|
|
20
|
-
success: bool
|
|
21
|
-
message: str
|
|
22
|
-
installed_path: Optional[Path] = None
|