connectonion 0.6.2__py3-none-any.whl → 0.6.4__py3-none-any.whl
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.
- connectonion/__init__.py +46 -9
- connectonion/cli/__init__.py +11 -1
- connectonion/cli/browser_agent/__init__.py +11 -1
- connectonion/cli/browser_agent/browser.py +13 -3
- connectonion/cli/browser_agent/element_finder.py +8 -0
- connectonion/cli/browser_agent/highlight_screenshot.py +9 -1
- connectonion/cli/browser_agent/scroll.py +8 -0
- connectonion/cli/co_ai/__init__.py +6 -0
- connectonion/cli/co_ai/agent.py +87 -0
- connectonion/cli/co_ai/agents/__init__.py +5 -0
- connectonion/cli/co_ai/agents/registry.py +57 -0
- connectonion/cli/co_ai/commands/__init__.py +45 -0
- connectonion/cli/co_ai/commands/compact.py +173 -0
- connectonion/cli/co_ai/commands/cost.py +77 -0
- connectonion/cli/co_ai/commands/export.py +60 -0
- connectonion/cli/co_ai/commands/help.py +80 -0
- connectonion/cli/co_ai/commands/init.py +101 -0
- connectonion/cli/co_ai/commands/sessions.py +55 -0
- connectonion/cli/co_ai/commands/tasks.py +63 -0
- connectonion/cli/co_ai/commands/undo.py +103 -0
- connectonion/cli/co_ai/context.py +127 -0
- connectonion/cli/co_ai/main.py +52 -0
- connectonion/cli/co_ai/plugins/__init__.py +5 -0
- connectonion/cli/co_ai/plugins/system_reminder.py +154 -0
- connectonion/cli/co_ai/prompts/agents/explore.md +79 -0
- connectonion/cli/co_ai/prompts/agents/plan.md +60 -0
- connectonion/cli/co_ai/prompts/assembler.py +303 -0
- connectonion/cli/{docs/co-vibecoding-principles-docs-contexts-all-in-one.md → co_ai/prompts/connectonion/README.md} +26 -0
- connectonion/cli/co_ai/prompts/connectonion/api.md +457 -0
- connectonion/cli/co_ai/prompts/connectonion/cli/README.md +805 -0
- connectonion/cli/co_ai/prompts/connectonion/cli/auth.md +46 -0
- connectonion/cli/co_ai/prompts/connectonion/cli/browser.md +235 -0
- connectonion/cli/co_ai/prompts/connectonion/cli/copy.md +184 -0
- connectonion/cli/co_ai/prompts/connectonion/cli/create.md +335 -0
- connectonion/cli/co_ai/prompts/connectonion/cli/init.md +431 -0
- connectonion/cli/co_ai/prompts/connectonion/co-directory-structure.md +214 -0
- connectonion/cli/co_ai/prompts/connectonion/concepts/agent.md +1078 -0
- connectonion/cli/co_ai/prompts/connectonion/concepts/events.md +816 -0
- connectonion/cli/co_ai/prompts/connectonion/concepts/llm_do.md +256 -0
- connectonion/cli/co_ai/prompts/connectonion/concepts/max_iterations.md +362 -0
- connectonion/cli/co_ai/prompts/connectonion/concepts/models.md +641 -0
- connectonion/cli/co_ai/prompts/connectonion/concepts/plugins.md +100 -0
- connectonion/cli/co_ai/prompts/connectonion/concepts/prompts.md +122 -0
- connectonion/cli/co_ai/prompts/connectonion/concepts/tools.md +512 -0
- connectonion/cli/co_ai/prompts/connectonion/concepts/transcribe.md +156 -0
- connectonion/cli/co_ai/prompts/connectonion/concepts/trust.md +291 -0
- connectonion/cli/co_ai/prompts/connectonion/debug/README.md +18 -0
- connectonion/cli/co_ai/prompts/connectonion/debug/auto_debug.md +1026 -0
- connectonion/cli/co_ai/prompts/connectonion/debug/console.md +129 -0
- connectonion/cli/co_ai/prompts/connectonion/debug/eval-format.md +178 -0
- connectonion/cli/co_ai/prompts/connectonion/debug/eval.md +230 -0
- connectonion/cli/co_ai/prompts/connectonion/debug/exceptions.md +307 -0
- connectonion/cli/co_ai/prompts/connectonion/debug/log.md +117 -0
- connectonion/cli/co_ai/prompts/connectonion/debug/xray.md +215 -0
- connectonion/cli/co_ai/prompts/connectonion/design-decisions/001-choosing-input-method.md +202 -0
- connectonion/cli/co_ai/prompts/connectonion/design-decisions/002-choosing-llm-function-name.md +202 -0
- connectonion/cli/co_ai/prompts/connectonion/design-decisions/003-choosing-trust-keyword.md +141 -0
- connectonion/cli/co_ai/prompts/connectonion/design-decisions/004-cli-create-flow.md +117 -0
- connectonion/cli/co_ai/prompts/connectonion/design-decisions/005-designing-agent-network-protocol.md +503 -0
- connectonion/cli/co_ai/prompts/connectonion/design-decisions/006-agent-address-format.md +305 -0
- connectonion/cli/co_ai/prompts/connectonion/design-decisions/007-authentication-backend-design.md +240 -0
- connectonion/cli/co_ai/prompts/connectonion/design-decisions/008-naming-is-hard.md +228 -0
- connectonion/cli/co_ai/prompts/connectonion/design-decisions/009-why-connect-function.md +167 -0
- connectonion/cli/co_ai/prompts/connectonion/design-decisions/010-cli-ux-progressive-disclosure.md +176 -0
- connectonion/cli/co_ai/prompts/connectonion/design-decisions/011-global-config-identity-management.md +357 -0
- connectonion/cli/co_ai/prompts/connectonion/design-decisions/012-tool-execution-separation.md +259 -0
- connectonion/cli/co_ai/prompts/connectonion/design-decisions/013-debug-and-logging-design.md +253 -0
- connectonion/cli/co_ai/prompts/connectonion/design-decisions/014-hook-system-design.md +510 -0
- connectonion/cli/co_ai/prompts/connectonion/design-decisions/015-interactive-auto-debug-design.md +837 -0
- connectonion/cli/co_ai/prompts/connectonion/design-decisions/016-why-no-zero-knowledge-proofs.md +358 -0
- connectonion/cli/co_ai/prompts/connectonion/design-decisions/017-session-logging-and-eval-format.md +120 -0
- connectonion/cli/co_ai/prompts/connectonion/design-decisions/018-event-api-naming.md +274 -0
- connectonion/cli/co_ai/prompts/connectonion/design-decisions/019-agent-lifecycle-design.md +655 -0
- connectonion/cli/co_ai/prompts/connectonion/design-decisions/020-trust-system-and-network-architecture.md +503 -0
- connectonion/cli/co_ai/prompts/connectonion/design-decisions/021-task-storage-jsonl-design.md +496 -0
- connectonion/cli/co_ai/prompts/connectonion/design-decisions/022-raw-asgi-implementation.md +273 -0
- connectonion/cli/co_ai/prompts/connectonion/examples/agent_reasoning.md +62 -0
- connectonion/cli/co_ai/prompts/connectonion/examples/atomic_tools.md +24 -0
- connectonion/cli/co_ai/prompts/connectonion/examples/load_guide.md +18 -0
- connectonion/cli/co_ai/prompts/connectonion/examples.md +0 -0
- connectonion/cli/co_ai/prompts/connectonion/hook-system-options.md +364 -0
- connectonion/cli/co_ai/prompts/connectonion/index.md +162 -0
- connectonion/cli/co_ai/prompts/connectonion/integrations/README.md +12 -0
- connectonion/cli/co_ai/prompts/connectonion/integrations/auth.md +450 -0
- connectonion/cli/co_ai/prompts/connectonion/integrations/google.md +431 -0
- connectonion/cli/co_ai/prompts/connectonion/integrations/microsoft.md +370 -0
- connectonion/cli/co_ai/prompts/connectonion/network/README.md +14 -0
- connectonion/cli/co_ai/prompts/connectonion/network/connect.md +543 -0
- connectonion/cli/co_ai/prompts/connectonion/network/connection.md +538 -0
- connectonion/cli/co_ai/prompts/connectonion/network/deploy.md +123 -0
- connectonion/cli/co_ai/prompts/connectonion/network/host.md +1049 -0
- connectonion/cli/co_ai/prompts/connectonion/network/protocol/agent-relay-protocol.md +495 -0
- connectonion/cli/co_ai/prompts/connectonion/network/protocol/announce-message.md +115 -0
- connectonion/cli/co_ai/prompts/connectonion/principles.md +124 -0
- connectonion/cli/co_ai/prompts/connectonion/quickstart.md +261 -0
- connectonion/cli/co_ai/prompts/connectonion/roadmap.md +81 -0
- connectonion/cli/co_ai/prompts/connectonion/templates/README.md +77 -0
- connectonion/cli/co_ai/prompts/connectonion/templates/meta-agent.md +152 -0
- connectonion/cli/co_ai/prompts/connectonion/templates/minimal.md +105 -0
- connectonion/cli/co_ai/prompts/connectonion/templates/playwright.md +130 -0
- connectonion/cli/co_ai/prompts/connectonion/templates/web-research.md +144 -0
- connectonion/cli/co_ai/prompts/connectonion/tui/README.md +95 -0
- connectonion/cli/co_ai/prompts/connectonion/tui/chat.md +181 -0
- connectonion/cli/co_ai/prompts/connectonion/tui/divider.md +63 -0
- connectonion/cli/co_ai/prompts/connectonion/tui/dropdown.md +83 -0
- connectonion/cli/co_ai/prompts/connectonion/tui/footer.md +44 -0
- connectonion/cli/co_ai/prompts/connectonion/tui/fuzzy.md +68 -0
- connectonion/cli/co_ai/prompts/connectonion/tui/input.md +84 -0
- connectonion/cli/co_ai/prompts/connectonion/tui/keys.md +77 -0
- connectonion/cli/co_ai/prompts/connectonion/tui/pick.md +71 -0
- connectonion/cli/co_ai/prompts/connectonion/tui/providers.md +89 -0
- connectonion/cli/co_ai/prompts/connectonion/tui/status_bar.md +67 -0
- connectonion/cli/co_ai/prompts/connectonion/useful_plugins/README.md +156 -0
- connectonion/cli/co_ai/prompts/connectonion/useful_plugins/calendar_plugin.md +68 -0
- connectonion/cli/co_ai/prompts/connectonion/useful_plugins/eval.md +89 -0
- connectonion/cli/co_ai/prompts/connectonion/useful_plugins/gmail_plugin.md +68 -0
- connectonion/cli/co_ai/prompts/connectonion/useful_plugins/image_result_formatter.md +74 -0
- connectonion/cli/co_ai/prompts/connectonion/useful_plugins/re_act.md +86 -0
- connectonion/cli/co_ai/prompts/connectonion/useful_plugins/shell_approval.md +69 -0
- connectonion/cli/co_ai/prompts/connectonion/useful_tools/README.md +81 -0
- connectonion/cli/co_ai/prompts/connectonion/useful_tools/diff_writer.md +138 -0
- connectonion/cli/co_ai/prompts/connectonion/useful_tools/get_emails.md +499 -0
- connectonion/cli/co_ai/prompts/connectonion/useful_tools/gmail.md +135 -0
- connectonion/cli/co_ai/prompts/connectonion/useful_tools/google_calendar.md +106 -0
- connectonion/cli/co_ai/prompts/connectonion/useful_tools/memory.md +486 -0
- connectonion/cli/co_ai/prompts/connectonion/useful_tools/microsoft_calendar.md +106 -0
- connectonion/cli/co_ai/prompts/connectonion/useful_tools/outlook.md +120 -0
- connectonion/cli/co_ai/prompts/connectonion/useful_tools/send_email.md +403 -0
- connectonion/cli/co_ai/prompts/connectonion/useful_tools/shell.md +95 -0
- connectonion/cli/co_ai/prompts/connectonion/useful_tools/slash_command.md +96 -0
- connectonion/cli/co_ai/prompts/connectonion/useful_tools/terminal.md +97 -0
- connectonion/cli/co_ai/prompts/connectonion/useful_tools/todo_list.md +252 -0
- connectonion/cli/co_ai/prompts/connectonion/useful_tools/web_fetch.md +130 -0
- connectonion/cli/co_ai/prompts/connectonion/vibe-coding-guide.md +97 -0
- connectonion/cli/co_ai/prompts/connectonion/windows-support.md +258 -0
- connectonion/cli/co_ai/prompts/main.md +247 -0
- connectonion/cli/co_ai/prompts/summarization.md +55 -0
- connectonion/cli/co_ai/prompts/system-reminders/agent.md +23 -0
- connectonion/cli/co_ai/prompts/system-reminders/plan_mode.md +13 -0
- connectonion/cli/co_ai/prompts/system-reminders/security.md +14 -0
- connectonion/cli/co_ai/prompts/system-reminders/simplicity.md +14 -0
- connectonion/cli/co_ai/prompts/tools/ask_user.md +61 -0
- connectonion/cli/co_ai/prompts/tools/background.md +57 -0
- connectonion/cli/co_ai/prompts/tools/edit.md +90 -0
- connectonion/cli/co_ai/prompts/tools/glob.md +52 -0
- connectonion/cli/co_ai/prompts/tools/grep.md +55 -0
- connectonion/cli/co_ai/prompts/tools/plan_mode.md +80 -0
- connectonion/cli/co_ai/prompts/tools/read.md +40 -0
- connectonion/cli/co_ai/prompts/tools/shell.md +67 -0
- connectonion/cli/co_ai/prompts/tools/task.md +51 -0
- connectonion/cli/co_ai/prompts/tools/todo.md +139 -0
- connectonion/cli/co_ai/prompts/tools/write.md +47 -0
- connectonion/cli/co_ai/prompts/workflow.md +89 -0
- connectonion/cli/co_ai/sessions.py +110 -0
- connectonion/cli/co_ai/skills/__init__.py +37 -0
- connectonion/cli/co_ai/skills/builtin/commit/SKILL.md +63 -0
- connectonion/cli/co_ai/skills/builtin/review-pr/SKILL.md +76 -0
- connectonion/cli/co_ai/skills/loader.py +166 -0
- connectonion/cli/co_ai/skills/tool.py +46 -0
- connectonion/cli/co_ai/tools/__init__.py +92 -0
- connectonion/cli/co_ai/tools/ask_user.py +35 -0
- connectonion/cli/co_ai/tools/background.py +201 -0
- connectonion/cli/co_ai/tools/diff_writer.py +291 -0
- connectonion/cli/co_ai/tools/edit.py +89 -0
- connectonion/cli/co_ai/tools/glob.py +84 -0
- connectonion/cli/co_ai/tools/grep.py +158 -0
- connectonion/cli/co_ai/tools/load_guide.py +23 -0
- connectonion/cli/co_ai/tools/multi_edit.py +116 -0
- connectonion/cli/co_ai/tools/plan_mode.py +169 -0
- connectonion/cli/co_ai/tools/read.py +61 -0
- connectonion/cli/co_ai/tools/task.py +59 -0
- connectonion/cli/co_ai/tools/todo_list.py +159 -0
- connectonion/cli/co_ai/tools/write.py +126 -0
- connectonion/cli/commands/__init__.py +11 -1
- connectonion/cli/commands/ai_commands.py +34 -0
- connectonion/cli/commands/copy_commands.py +55 -6
- connectonion/cli/commands/create.py +20 -17
- connectonion/cli/commands/init.py +19 -22
- connectonion/cli/commands/project_cmd_lib.py +15 -0
- connectonion/cli/main.py +11 -0
- connectonion/console.py +15 -1
- connectonion/core/__init__.py +10 -1
- connectonion/core/agent.py +37 -16
- connectonion/core/exceptions.py +74 -0
- connectonion/core/llm.py +54 -6
- connectonion/core/tool_executor.py +32 -31
- connectonion/core/tool_factory.py +47 -10
- connectonion/debug/__init__.py +10 -1
- connectonion/debug/debug_explainer/__init__.py +10 -1
- connectonion/debug/execution_analyzer/__init__.py +10 -1
- connectonion/debug/execution_analyzer/execution_analysis.py +5 -2
- connectonion/debug/runtime_inspector/__init__.py +10 -1
- connectonion/docs/.package-ignore +6 -0
- connectonion/docs/README.md +2036 -0
- connectonion/docs/api.md +457 -0
- connectonion/docs/archive/001-ai-agent-is-just-prompt-plus-function.md +249 -0
- connectonion/docs/archive/README.md +53 -0
- connectonion/docs/archive/archive/consolidation-plan.md +72 -0
- connectonion/docs/archive/archive/core-principles-extracted.md +239 -0
- connectonion/docs/archive/archive/master-principles.md +222 -0
- connectonion/docs/archive/archive/principles.md +293 -0
- connectonion/docs/archive/archive/simplicity-principles.md +221 -0
- connectonion/docs/archive/attack-defense-insights.md +410 -0
- connectonion/docs/archive/business-model.md +305 -0
- connectonion/docs/archive/core-principles-unified.md +190 -0
- connectonion/docs/archive/discussion-journey.md +178 -0
- connectonion/docs/archive/economic-analysis.md +323 -0
- connectonion/docs/archive/features/01-share-and-find.md +256 -0
- connectonion/docs/archive/features/02-agent-authentication.md +93 -0
- connectonion/docs/archive/features/03-test-before-trust.md +71 -0
- connectonion/docs/archive/features/06-reliability-and-offline.md +197 -0
- connectonion/docs/archive/features/README.md +46 -0
- connectonion/docs/archive/features-roadmap.md +247 -0
- connectonion/docs/archive/mcp-comparison-insights.md +215 -0
- connectonion/docs/archive/migration-strategy.md +571 -0
- connectonion/docs/archive/mini-whitepaper.md +293 -0
- connectonion/docs/archive/network-protocol.md +394 -0
- connectonion/docs/archive/semantic-revolution.md +367 -0
- connectonion/docs/archive/technical-architecture.md +453 -0
- connectonion/docs/archive/the-semantic-insight.md +207 -0
- connectonion/docs/archive/threat-model.md +164 -0
- connectonion/docs/cli/README.md +805 -0
- connectonion/docs/cli/auth.md +46 -0
- connectonion/docs/cli/browser.md +235 -0
- connectonion/docs/cli/copy.md +232 -0
- connectonion/docs/cli/create.md +335 -0
- connectonion/docs/cli/init.md +431 -0
- connectonion/docs/co-directory-structure.md +214 -0
- connectonion/docs/concepts/agent.md +1078 -0
- connectonion/docs/concepts/events.md +699 -0
- connectonion/docs/concepts/llm_do.md +256 -0
- connectonion/docs/concepts/max_iterations.md +362 -0
- connectonion/docs/concepts/models.md +641 -0
- connectonion/docs/concepts/plugins.md +101 -0
- connectonion/docs/concepts/prompts.md +122 -0
- connectonion/docs/concepts/session.md +428 -0
- connectonion/docs/concepts/tools.md +512 -0
- connectonion/docs/concepts/transcribe.md +156 -0
- connectonion/docs/concepts/trust.md +291 -0
- connectonion/docs/connectonion.md +1256 -0
- connectonion/docs/debug/README.md +18 -0
- connectonion/docs/debug/auto_debug.md +1026 -0
- connectonion/docs/debug/console.md +129 -0
- connectonion/docs/debug/eval-format.md +178 -0
- connectonion/docs/debug/eval.md +230 -0
- connectonion/docs/debug/exceptions.md +307 -0
- connectonion/docs/debug/log.md +117 -0
- connectonion/docs/debug/xray.md +215 -0
- connectonion/docs/design-decisions/001-choosing-input-method.md +202 -0
- connectonion/docs/design-decisions/002-choosing-llm-function-name.md +202 -0
- connectonion/docs/design-decisions/003-choosing-trust-keyword.md +141 -0
- connectonion/docs/design-decisions/004-cli-create-flow.md +117 -0
- connectonion/docs/design-decisions/005-designing-agent-network-protocol.md +503 -0
- connectonion/docs/design-decisions/006-agent-address-format.md +305 -0
- connectonion/docs/design-decisions/007-authentication-backend-design.md +240 -0
- connectonion/docs/design-decisions/008-naming-is-hard.md +228 -0
- connectonion/docs/design-decisions/009-why-connect-function.md +167 -0
- connectonion/docs/design-decisions/010-cli-ux-progressive-disclosure.md +176 -0
- connectonion/docs/design-decisions/011-global-config-identity-management.md +357 -0
- connectonion/docs/design-decisions/012-tool-execution-separation.md +259 -0
- connectonion/docs/design-decisions/013-debug-and-logging-design.md +253 -0
- connectonion/docs/design-decisions/014-hook-system-design.md +510 -0
- connectonion/docs/design-decisions/015-interactive-auto-debug-design.md +837 -0
- connectonion/docs/design-decisions/016-why-no-zero-knowledge-proofs.md +358 -0
- connectonion/docs/design-decisions/017-session-logging-and-eval-format.md +120 -0
- connectonion/docs/design-decisions/018-event-api-naming.md +274 -0
- connectonion/docs/design-decisions/019-agent-lifecycle-design.md +655 -0
- connectonion/docs/design-decisions/020-trust-system-and-network-architecture.md +503 -0
- connectonion/docs/design-decisions/021-task-storage-jsonl-design.md +496 -0
- connectonion/docs/design-decisions/022-raw-asgi-implementation.md +273 -0
- connectonion/docs/examples.md +0 -0
- connectonion/docs/hook-system-options.md +364 -0
- connectonion/docs/integrations/README.md +12 -0
- connectonion/docs/integrations/auth.md +450 -0
- connectonion/docs/integrations/google.md +431 -0
- connectonion/docs/integrations/microsoft.md +370 -0
- connectonion/docs/network/README.md +14 -0
- connectonion/docs/network/connect.md +629 -0
- connectonion/docs/network/deploy.md +124 -0
- connectonion/docs/network/host.md +1087 -0
- connectonion/docs/network/io.md +538 -0
- connectonion/docs/network/protocol/agent-relay-protocol.md +495 -0
- connectonion/docs/network/protocol/announce-message.md +115 -0
- connectonion/docs/principles.md +124 -0
- connectonion/docs/quickstart.md +261 -0
- connectonion/docs/roadmap.md +81 -0
- connectonion/docs/templates/README.md +77 -0
- connectonion/docs/templates/meta-agent.md +152 -0
- connectonion/docs/templates/minimal.md +105 -0
- connectonion/docs/templates/playwright.md +130 -0
- connectonion/docs/templates/web-research.md +144 -0
- connectonion/docs/tui/README.md +95 -0
- connectonion/docs/tui/chat.md +181 -0
- connectonion/docs/tui/divider.md +63 -0
- connectonion/docs/tui/dropdown.md +83 -0
- connectonion/docs/tui/footer.md +44 -0
- connectonion/docs/tui/fuzzy.md +68 -0
- connectonion/docs/tui/input.md +84 -0
- connectonion/docs/tui/keys.md +77 -0
- connectonion/docs/tui/pick.md +71 -0
- connectonion/docs/tui/providers.md +89 -0
- connectonion/docs/tui/status_bar.md +67 -0
- connectonion/docs/useful_plugins/README.md +160 -0
- connectonion/docs/useful_plugins/calendar_plugin.md +68 -0
- connectonion/docs/useful_plugins/eval.md +89 -0
- connectonion/docs/useful_plugins/gmail_plugin.md +68 -0
- connectonion/docs/useful_plugins/image_result_formatter.md +74 -0
- connectonion/docs/useful_plugins/re_act.md +86 -0
- connectonion/docs/useful_plugins/shell_approval.md +69 -0
- connectonion/docs/useful_plugins/system_reminder.md +210 -0
- connectonion/docs/useful_plugins/tool_approval.md +139 -0
- connectonion/docs/useful_prompts/README.md +127 -0
- connectonion/docs/useful_prompts/coding_agent.md +214 -0
- connectonion/docs/useful_tools/README.md +81 -0
- connectonion/docs/useful_tools/ask_user.md +103 -0
- connectonion/docs/useful_tools/diff_writer.md +158 -0
- connectonion/docs/useful_tools/get_emails.md +519 -0
- connectonion/docs/useful_tools/gmail.md +155 -0
- connectonion/docs/useful_tools/google_calendar.md +126 -0
- connectonion/docs/useful_tools/memory.md +506 -0
- connectonion/docs/useful_tools/microsoft_calendar.md +126 -0
- connectonion/docs/useful_tools/outlook.md +140 -0
- connectonion/docs/useful_tools/send_email.md +423 -0
- connectonion/docs/useful_tools/shell.md +115 -0
- connectonion/docs/useful_tools/slash_command.md +116 -0
- connectonion/docs/useful_tools/terminal.md +115 -0
- connectonion/docs/useful_tools/todo_list.md +272 -0
- connectonion/docs/useful_tools/web_fetch.md +150 -0
- connectonion/docs/vibe-coding-guide.md +97 -0
- connectonion/docs/windows-support.md +258 -0
- connectonion/logger.py +3 -3
- connectonion/network/__init__.py +19 -6
- connectonion/network/asgi/__init__.py +81 -0
- connectonion/network/asgi/http.py +205 -0
- connectonion/network/asgi/websocket.py +217 -0
- connectonion/network/connect.py +232 -185
- connectonion/network/host/__init__.py +59 -0
- connectonion/network/host/auth.py +191 -0
- connectonion/network/host/routes.py +135 -0
- connectonion/network/host/server.py +289 -0
- connectonion/network/host/session.py +78 -0
- connectonion/network/io/__init__.py +21 -0
- connectonion/network/{connection.py → io/base.py} +17 -42
- connectonion/network/io/websocket.py +55 -0
- connectonion/network/relay.py +37 -16
- connectonion/network/trust/__init__.py +30 -0
- connectonion/network/trust/factory.py +138 -0
- connectonion/network/{trust_agents.py → trust/prompts.py} +3 -3
- connectonion/network/{trust_functions.py → trust/tools.py} +2 -2
- connectonion/prompt_files/__init__.py +11 -1
- connectonion/prompt_files/react_acknowledge.md +26 -0
- connectonion/prompts.py +10 -1
- connectonion/tui/chat.py +10 -1
- connectonion/tui/divider.py +10 -1
- connectonion/tui/dropdown.py +10 -1
- connectonion/tui/footer.py +8 -0
- connectonion/tui/fuzzy.py +11 -1
- connectonion/tui/input.py +118 -70
- connectonion/tui/keys.py +133 -6
- connectonion/tui/providers.py +11 -1
- connectonion/tui/status_bar.py +10 -1
- connectonion/useful_events_handlers/__init__.py +8 -0
- connectonion/useful_events_handlers/reflect.py +19 -4
- connectonion/useful_plugins/__init__.py +3 -1
- connectonion/useful_plugins/eval.py +2 -2
- connectonion/useful_plugins/gmail_plugin.py +3 -3
- connectonion/useful_plugins/image_result_formatter.py +3 -3
- connectonion/useful_plugins/re_act.py +114 -28
- connectonion/useful_plugins/shell_approval.py +2 -2
- connectonion/useful_plugins/system_reminder.py +103 -0
- connectonion/useful_plugins/tool_approval.py +233 -0
- connectonion/useful_plugins/ui_stream.py +18 -133
- connectonion/useful_prompts/README.md +61 -0
- connectonion/useful_prompts/__init__.py +45 -0
- connectonion/useful_prompts/coding_agent/README.md +106 -0
- connectonion/useful_prompts/coding_agent/assembler.py +123 -0
- connectonion/useful_prompts/coding_agent/prompts/main.md +227 -0
- connectonion/useful_prompts/coding_agent/prompts/tools/ask_user.md +61 -0
- connectonion/useful_prompts/coding_agent/prompts/tools/background.md +57 -0
- connectonion/useful_prompts/coding_agent/prompts/tools/edit.md +90 -0
- connectonion/useful_prompts/coding_agent/prompts/tools/glob.md +52 -0
- connectonion/useful_prompts/coding_agent/prompts/tools/grep.md +55 -0
- connectonion/useful_prompts/coding_agent/prompts/tools/plan_mode.md +80 -0
- connectonion/useful_prompts/coding_agent/prompts/tools/read.md +40 -0
- connectonion/useful_prompts/coding_agent/prompts/tools/shell.md +67 -0
- connectonion/useful_prompts/coding_agent/prompts/tools/task.md +51 -0
- connectonion/useful_prompts/coding_agent/prompts/tools/todo.md +139 -0
- connectonion/useful_prompts/coding_agent/prompts/tools/write.md +48 -0
- connectonion/useful_prompts/system-reminders/security-warning.md +14 -0
- connectonion/useful_prompts/system-reminders/test-reminder.md +11 -0
- connectonion/useful_tools/__init__.py +31 -4
- connectonion/useful_tools/ask_user.py +35 -0
- connectonion/useful_tools/bash.py +69 -0
- connectonion/useful_tools/diff_writer.py +186 -94
- connectonion/useful_tools/edit.py +102 -0
- connectonion/useful_tools/glob_files.py +97 -0
- connectonion/useful_tools/grep_files.py +171 -0
- connectonion/useful_tools/multi_edit.py +116 -0
- connectonion/useful_tools/read_file.py +73 -0
- connectonion/useful_tools/shell.py +50 -45
- connectonion/useful_tools/write_file.py +129 -0
- {connectonion-0.6.2.dist-info → connectonion-0.6.4.dist-info}/METADATA +10 -3
- connectonion-0.6.4.dist-info/RECORD +472 -0
- connectonion/network/asgi.py +0 -407
- connectonion/network/host.py +0 -616
- connectonion/network/trust.py +0 -166
- connectonion-0.6.2.dist-info/RECORD +0 -129
- /connectonion/cli/{docs → co_ai/prompts/connectonion}/connectonion.md +0 -0
- {connectonion-0.6.2.dist-info → connectonion-0.6.4.dist-info}/WHEEL +0 -0
- {connectonion-0.6.2.dist-info → connectonion-0.6.4.dist-info}/entry_points.txt +0 -0
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
# Naming is Hard: Why We Chose "Address" Over "Identity"
|
|
2
|
+
|
|
3
|
+
*September 3, 2025*
|
|
4
|
+
|
|
5
|
+
There's a famous quote in computer science: "There are only two hard things in Computer Science: cache invalidation and naming things." Today, we're talking about the second one.
|
|
6
|
+
|
|
7
|
+
## The Naming Dilemma
|
|
8
|
+
|
|
9
|
+
When implementing key generation for ConnectOnion agents, we had a seemingly simple decision: what do we call this thing that uniquely identifies an agent?
|
|
10
|
+
|
|
11
|
+
Our first draft:
|
|
12
|
+
```python
|
|
13
|
+
# connectonion/crypto.py
|
|
14
|
+
def generate_agent_identity():
|
|
15
|
+
"""Generate cryptographic identity for agent."""
|
|
16
|
+
...
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
It felt sophisticated. Technical. Important. It also felt... wrong.
|
|
20
|
+
|
|
21
|
+
## The Options We Considered
|
|
22
|
+
|
|
23
|
+
### Option 1: Identity
|
|
24
|
+
```python
|
|
25
|
+
identity = generate_agent_identity()
|
|
26
|
+
print(f"Agent identity: {identity}")
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
**Pros:**
|
|
30
|
+
- Sounds comprehensive
|
|
31
|
+
- Technically accurate (it IS an identity)
|
|
32
|
+
- Used by many identity systems
|
|
33
|
+
|
|
34
|
+
**Cons:**
|
|
35
|
+
- Abstract and vague
|
|
36
|
+
- Makes users think "identity management" (scary!)
|
|
37
|
+
- Overloaded term in software
|
|
38
|
+
|
|
39
|
+
### Option 2: ID
|
|
40
|
+
```python
|
|
41
|
+
agent_id = generate_agent_id()
|
|
42
|
+
print(f"Agent ID: {agent_id}")
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
**Pros:**
|
|
46
|
+
- Short and simple
|
|
47
|
+
- Familiar from databases
|
|
48
|
+
|
|
49
|
+
**Cons:**
|
|
50
|
+
- Too generic
|
|
51
|
+
- Doesn't convey that it's cryptographic
|
|
52
|
+
- Confusion with database IDs
|
|
53
|
+
|
|
54
|
+
### Option 3: Key
|
|
55
|
+
```python
|
|
56
|
+
agent_key = generate_agent_key()
|
|
57
|
+
print(f"Agent key: {agent_key}")
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
**Pros:**
|
|
61
|
+
- Technically accurate
|
|
62
|
+
- Developers understand keys
|
|
63
|
+
|
|
64
|
+
**Cons:**
|
|
65
|
+
- Which key? Public? Private?
|
|
66
|
+
- Sounds like API keys
|
|
67
|
+
- Implementation detail, not user concept
|
|
68
|
+
|
|
69
|
+
### Option 4: Address
|
|
70
|
+
```python
|
|
71
|
+
address = generate_address()
|
|
72
|
+
print(f"Agent address: {address}")
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
**Pros:**
|
|
76
|
+
- Immediately understood
|
|
77
|
+
- Familiar from email, web, crypto
|
|
78
|
+
- Concrete and specific
|
|
79
|
+
- Matches user mental model
|
|
80
|
+
|
|
81
|
+
**Cons:**
|
|
82
|
+
- ...actually, none?
|
|
83
|
+
|
|
84
|
+
## The Winner: Address
|
|
85
|
+
|
|
86
|
+
We chose "address" because it just makes sense. Everyone understands addresses:
|
|
87
|
+
- Email has addresses
|
|
88
|
+
- Websites have addresses
|
|
89
|
+
- Ethereum has addresses
|
|
90
|
+
- Even physical mail has addresses
|
|
91
|
+
|
|
92
|
+
When you tell someone "this is your agent's address," they immediately understand it's how others can reach that agent.
|
|
93
|
+
|
|
94
|
+
## The Ripple Effect
|
|
95
|
+
|
|
96
|
+
Once we chose "address," everything else fell into place:
|
|
97
|
+
|
|
98
|
+
```python
|
|
99
|
+
# Before (confusing)
|
|
100
|
+
from connectonion.crypto import generate_agent_identity
|
|
101
|
+
identity = generate_agent_identity()
|
|
102
|
+
save_identity(identity)
|
|
103
|
+
|
|
104
|
+
# After (clear)
|
|
105
|
+
from connectonion.address import generate
|
|
106
|
+
address = generate()
|
|
107
|
+
save(address)
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
The file name became obvious too:
|
|
111
|
+
- ❌ `crypto.py` - Scary, too broad
|
|
112
|
+
- ❌ `identity.py` - Abstract
|
|
113
|
+
- ❌ `keys.py` - Implementation detail
|
|
114
|
+
- ✅ `address.py` - Perfect!
|
|
115
|
+
|
|
116
|
+
## Function Names Got Simpler Too
|
|
117
|
+
|
|
118
|
+
When the module name provides context, function names can be simpler:
|
|
119
|
+
|
|
120
|
+
```python
|
|
121
|
+
# connectonion/address.py
|
|
122
|
+
|
|
123
|
+
def generate() -> dict:
|
|
124
|
+
"""Generate new agent address."""
|
|
125
|
+
|
|
126
|
+
def recover(seed_phrase: str) -> dict:
|
|
127
|
+
"""Recover address from seed phrase."""
|
|
128
|
+
|
|
129
|
+
def save(address_data: dict, path: Path):
|
|
130
|
+
"""Save address keys."""
|
|
131
|
+
|
|
132
|
+
def load(path: Path) -> dict:
|
|
133
|
+
"""Load address keys."""
|
|
134
|
+
|
|
135
|
+
def verify(address: str, message: bytes, signature: bytes) -> bool:
|
|
136
|
+
"""Verify signature from address."""
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
No need to repeat "address" in every function - the module name makes it clear.
|
|
140
|
+
|
|
141
|
+
## The Lesson: Use Familiar Words
|
|
142
|
+
|
|
143
|
+
We developers love to invent new terminology. It makes us feel smart. But users don't care about our clever naming - they just want things to make sense.
|
|
144
|
+
|
|
145
|
+
Consider these transformations:
|
|
146
|
+
- "Cryptographic identity" → "Address"
|
|
147
|
+
- "Mnemonic seed phrase" → "Recovery phrase"
|
|
148
|
+
- "Ed25519 public key" → "Agent address"
|
|
149
|
+
- "Signing key" → "Private key"
|
|
150
|
+
|
|
151
|
+
The right side is always clearer.
|
|
152
|
+
|
|
153
|
+
## A Real Conversation
|
|
154
|
+
|
|
155
|
+
This actual conversation happened during code review:
|
|
156
|
+
|
|
157
|
+
"What should we call the thing that identifies an agent?"
|
|
158
|
+
"What does it do?"
|
|
159
|
+
"Other agents use it to send messages to this agent."
|
|
160
|
+
"So... an address?"
|
|
161
|
+
"Oh. Yeah. An address."
|
|
162
|
+
|
|
163
|
+
Sometimes the obvious answer is the right answer.
|
|
164
|
+
|
|
165
|
+
## The Bigger Pattern
|
|
166
|
+
|
|
167
|
+
This decision reflects a broader pattern in ConnectOnion:
|
|
168
|
+
|
|
169
|
+
1. **Use existing mental models** - Don't make users learn new concepts
|
|
170
|
+
2. **Prefer concrete over abstract** - "Address" not "Identity"
|
|
171
|
+
3. **Choose familiar over precise** - "Recovery phrase" not "BIP39 mnemonic"
|
|
172
|
+
4. **Name from the user's perspective** - Not from the implementation
|
|
173
|
+
|
|
174
|
+
## The Implementation
|
|
175
|
+
|
|
176
|
+
Here's what we ended up with:
|
|
177
|
+
|
|
178
|
+
```python
|
|
179
|
+
from connectonion import address
|
|
180
|
+
|
|
181
|
+
# Generate new agent (simple!)
|
|
182
|
+
my_address = address.generate()
|
|
183
|
+
print(f"Agent address: {my_address['address']}")
|
|
184
|
+
|
|
185
|
+
# Save it (obvious!)
|
|
186
|
+
address.save(my_address, Path(".co"))
|
|
187
|
+
|
|
188
|
+
# Load it later (clear!)
|
|
189
|
+
my_address = address.load(Path(".co"))
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
No confusion. No abstraction. Just addresses.
|
|
193
|
+
|
|
194
|
+
## Counter-Examples: When We Got It Wrong
|
|
195
|
+
|
|
196
|
+
We're not perfect. Here are times we chose poorly:
|
|
197
|
+
|
|
198
|
+
**Bad:** `llm_do()` - What does "do" mean?
|
|
199
|
+
**Better:** `llm_function()` or `llm_tool()`
|
|
200
|
+
|
|
201
|
+
**Bad:** `co init` - Init what?
|
|
202
|
+
**Better:** Could have been `co create` or `co new`
|
|
203
|
+
|
|
204
|
+
We keep these as reminders that naming is hard, and we don't always get it right the first time.
|
|
205
|
+
|
|
206
|
+
## The Test: Explain It To Someone
|
|
207
|
+
|
|
208
|
+
The ultimate test for naming: explain it to someone unfamiliar with your project.
|
|
209
|
+
|
|
210
|
+
"Your agent has an address. Other agents use it to send messages."
|
|
211
|
+
|
|
212
|
+
vs
|
|
213
|
+
|
|
214
|
+
"Your agent has a cryptographic identity derived from an Ed25519 keypair that serves as a unique identifier in the network protocol."
|
|
215
|
+
|
|
216
|
+
Which would you rather hear?
|
|
217
|
+
|
|
218
|
+
## Conclusion
|
|
219
|
+
|
|
220
|
+
Good naming isn't about being clever or technically precise. It's about being clear. When in doubt, choose the boring, familiar word that everyone already understands.
|
|
221
|
+
|
|
222
|
+
That's why every ConnectOnion agent has an address, not an identity. It's why you have a recovery phrase, not a mnemonic seed. It's why you run `co init`, not `co scaffold-project-structure`.
|
|
223
|
+
|
|
224
|
+
Keep it simple. Use words people know. Save the cleverness for the implementation, not the interface.
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
|
|
228
|
+
*P.S. We spent 30 minutes debating "address" vs "identity". Those 30 minutes were worth it. Good naming pays dividends forever.*
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
# Why We Chose `connect()` for Remote Agents
|
|
2
|
+
|
|
3
|
+
*The journey to finding the right interface for connecting to remote agents*
|
|
4
|
+
|
|
5
|
+
## The Problem
|
|
6
|
+
|
|
7
|
+
When developers want to use a remote AI agent, they need a simple, intuitive way to establish that connection. The challenge was finding the right verb that:
|
|
8
|
+
- Clearly indicates remote interaction
|
|
9
|
+
- Returns an object to interact with
|
|
10
|
+
- Feels familiar to developers
|
|
11
|
+
- Distinguishes from local agent creation
|
|
12
|
+
|
|
13
|
+
## What We Considered
|
|
14
|
+
|
|
15
|
+
### Option 1: `RemoteAgent()` Class
|
|
16
|
+
```python
|
|
17
|
+
translator = RemoteAgent("0x3d40...")
|
|
18
|
+
```
|
|
19
|
+
✅ Crystal clear it's remote
|
|
20
|
+
❌ Verbose (11 extra characters)
|
|
21
|
+
❌ Exposes implementation details
|
|
22
|
+
|
|
23
|
+
### Option 2: `client()` Function
|
|
24
|
+
```python
|
|
25
|
+
translator = client("0x3d40...")
|
|
26
|
+
```
|
|
27
|
+
✅ Follows database patterns (MongoClient, RedisClient)
|
|
28
|
+
❌ It's a noun, not a verb - feels awkward
|
|
29
|
+
❌ Implies client/server architecture
|
|
30
|
+
|
|
31
|
+
### Option 3: `get()` Function
|
|
32
|
+
```python
|
|
33
|
+
translator = get("0x3d40...")
|
|
34
|
+
```
|
|
35
|
+
✅ Shortest (3 characters)
|
|
36
|
+
✅ Familiar from REST APIs
|
|
37
|
+
❌ Too generic - get what exactly?
|
|
38
|
+
|
|
39
|
+
### Option 4: `use()` Function
|
|
40
|
+
```python
|
|
41
|
+
translator = use("0x3d40...")
|
|
42
|
+
```
|
|
43
|
+
✅ Natural language
|
|
44
|
+
✅ Very short
|
|
45
|
+
❌ Too vague about what's happening
|
|
46
|
+
|
|
47
|
+
### Option 5: `reach()` Function
|
|
48
|
+
```python
|
|
49
|
+
translator = reach("0x3d40...")
|
|
50
|
+
```
|
|
51
|
+
✅ Implies remote interaction
|
|
52
|
+
✅ Natural English
|
|
53
|
+
❌ Unfamiliar pattern in programming
|
|
54
|
+
|
|
55
|
+
## Why `connect()` Won
|
|
56
|
+
|
|
57
|
+
```python
|
|
58
|
+
from connectonion import connect
|
|
59
|
+
|
|
60
|
+
translator = connect("0x3d40...")
|
|
61
|
+
result = translator.input("Translate hello")
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### 1. Familiar Pattern
|
|
65
|
+
Developers already use `connect()` everywhere:
|
|
66
|
+
```python
|
|
67
|
+
# Databases
|
|
68
|
+
db = psycopg2.connect("postgresql://...")
|
|
69
|
+
redis = redis.connect("redis://...")
|
|
70
|
+
|
|
71
|
+
# Our pattern
|
|
72
|
+
agent = connect("0x3d40...")
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### 2. Clear Semantics
|
|
76
|
+
The word "connect" immediately tells developers:
|
|
77
|
+
- This is a network operation
|
|
78
|
+
- You're establishing a connection to something remote
|
|
79
|
+
- It returns something you can interact with
|
|
80
|
+
|
|
81
|
+
### 3. No Confusion with Local Agents
|
|
82
|
+
```python
|
|
83
|
+
# Creating local agent - uses class
|
|
84
|
+
my_agent = Agent("translator", tools=[...])
|
|
85
|
+
|
|
86
|
+
# Connecting to remote - uses function
|
|
87
|
+
their_agent = connect("0x3d40...")
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Clear distinction: `Agent` class for creation, `connect` function for remote access.
|
|
91
|
+
|
|
92
|
+
### 4. Verb Returns Noun
|
|
93
|
+
`connect()` is a verb that returns a connection object - this is a natural pattern:
|
|
94
|
+
- The action (connect) returns the result (connected agent interface)
|
|
95
|
+
- You connect and get back something to use
|
|
96
|
+
- No ambiguity about what you're getting
|
|
97
|
+
|
|
98
|
+
### 5. Handles Everything Automatically
|
|
99
|
+
When you call `connect()`, the framework:
|
|
100
|
+
1. Connects to relay at `wss://oo.openonion.ai`
|
|
101
|
+
2. Queries agent information
|
|
102
|
+
3. Attempts direct TCP connection
|
|
103
|
+
4. Falls back to relay if needed
|
|
104
|
+
5. Returns ready-to-use interface
|
|
105
|
+
|
|
106
|
+
The developer doesn't see this complexity - they just get a working agent.
|
|
107
|
+
|
|
108
|
+
## The Developer Experience
|
|
109
|
+
|
|
110
|
+
### Simple and Natural
|
|
111
|
+
```python
|
|
112
|
+
# The thought process
|
|
113
|
+
"I need to use that translator agent"
|
|
114
|
+
"I'll connect to it"
|
|
115
|
+
"Now I can use it"
|
|
116
|
+
|
|
117
|
+
# The code matches the thought
|
|
118
|
+
translator = connect("0x3d40...")
|
|
119
|
+
result = translator.input("Translate this")
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### Extensible
|
|
123
|
+
```python
|
|
124
|
+
# Basic usage
|
|
125
|
+
agent = connect("0x3d40...")
|
|
126
|
+
|
|
127
|
+
# Future extensions feel natural
|
|
128
|
+
agent = connect(find="translator")
|
|
129
|
+
agent = connect(need="something that translates")
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### Clear Error Messages
|
|
133
|
+
```python
|
|
134
|
+
# If connection fails
|
|
135
|
+
"Failed to connect to agent at 0x3d40..."
|
|
136
|
+
# Immediately understandable
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
## What `connect()` Returns
|
|
140
|
+
|
|
141
|
+
The `connect()` function returns a limited interface - not the full agent:
|
|
142
|
+
|
|
143
|
+
```python
|
|
144
|
+
class ConnectedAgent:
|
|
145
|
+
def input(self, prompt: str) -> str:
|
|
146
|
+
"""Send input to remote agent"""
|
|
147
|
+
|
|
148
|
+
@property
|
|
149
|
+
def address(self) -> str:
|
|
150
|
+
"""The agent's address"""
|
|
151
|
+
|
|
152
|
+
def is_online(self) -> bool:
|
|
153
|
+
"""Check if agent is reachable"""
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
This makes it clear you're working with a remote interface, not the agent itself.
|
|
157
|
+
|
|
158
|
+
## Conclusion
|
|
159
|
+
|
|
160
|
+
`connect()` strikes the perfect balance:
|
|
161
|
+
- **Familiar**: Developers know this pattern from databases
|
|
162
|
+
- **Clear**: Obviously a network operation
|
|
163
|
+
- **Simple**: Just 7 characters
|
|
164
|
+
- **Accurate**: You're connecting to get an interface
|
|
165
|
+
- **Extensible**: Can grow with the framework
|
|
166
|
+
|
|
167
|
+
The choice of `connect()` makes ConnectOnion feel instantly familiar while accurately representing what's happening under the hood.
|
connectonion/cli/co_ai/prompts/connectonion/design-decisions/010-cli-ux-progressive-disclosure.md
ADDED
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
# Why We Choose Progressive Disclosure Over Configuration Questionnaires
|
|
2
|
+
|
|
3
|
+
*Date: 2025-09-04*
|
|
4
|
+
|
|
5
|
+
## The Problem with Traditional CLI Tools
|
|
6
|
+
|
|
7
|
+
Most framework CLIs suffer from what we call "initialization fatigue" - they bombard users with questions that don't matter yet:
|
|
8
|
+
- What's your project description? (I don't know, I just started)
|
|
9
|
+
- Choose your testing framework? (Let me build something first)
|
|
10
|
+
- Configure your linter settings? (Please, just let me code)
|
|
11
|
+
- Set up CI/CD pipeline? (It's my first 5 seconds with this tool)
|
|
12
|
+
|
|
13
|
+
This approach assumes users know everything upfront. Reality: they don't, and they shouldn't have to.
|
|
14
|
+
|
|
15
|
+
## Our Philosophy: Progressive Disclosure
|
|
16
|
+
|
|
17
|
+
### Core Principle: Start Fast, Decide Later
|
|
18
|
+
|
|
19
|
+
We designed ConnectOnion's CLI around three principles:
|
|
20
|
+
1. **Get to working code in < 30 seconds**
|
|
21
|
+
2. **Make smart defaults, not lengthy questionnaires**
|
|
22
|
+
3. **Respect the user's time and intelligence**
|
|
23
|
+
|
|
24
|
+
### The Two-Command Strategy: Why Both `create` and `init`
|
|
25
|
+
|
|
26
|
+
We deliberately offer two commands instead of forcing one workflow:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
co create my-agent # Creates new directory
|
|
30
|
+
co init # Uses current directory
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
**Why?** Because context matters:
|
|
34
|
+
- **Outside a project**: Users want `co create my-agent` - it's natural to create a new space
|
|
35
|
+
- **Inside a project**: Users want `co init` - they've already decided where to work
|
|
36
|
+
|
|
37
|
+
This isn't redundancy; it's respecting user intent. Django does this (`django-admin startproject` vs `manage.py startapp`), Rails does this (`rails new` vs `rails generate`), and for good reason.
|
|
38
|
+
|
|
39
|
+
### Minimal Questions, Maximum Intelligence
|
|
40
|
+
|
|
41
|
+
Our setup flow asks only what matters RIGHT NOW:
|
|
42
|
+
1. **Enable AI?** - Determines available templates
|
|
43
|
+
2. **API key** - Only if AI enabled, with auto-detection
|
|
44
|
+
3. **Template** - With previews so users know what they get
|
|
45
|
+
|
|
46
|
+
That's it. Three decisions max.
|
|
47
|
+
|
|
48
|
+
Compare to typical CLIs:
|
|
49
|
+
- Create-react-app: 5+ questions
|
|
50
|
+
- Vue CLI: 10+ questions
|
|
51
|
+
- Yeoman generators: Often 15+ questions
|
|
52
|
+
|
|
53
|
+
### Smart API Key Detection
|
|
54
|
+
|
|
55
|
+
Instead of asking "Which provider are you using?", we detect it:
|
|
56
|
+
|
|
57
|
+
```python
|
|
58
|
+
if api_key.startswith('sk-proj-'):
|
|
59
|
+
# OpenAI project key
|
|
60
|
+
elif api_key.startswith('sk-ant-'):
|
|
61
|
+
# Anthropic
|
|
62
|
+
elif api_key.startswith('gsk_'):
|
|
63
|
+
# Groq
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
**Why?** The key format already tells us. Why make users answer what we can infer?
|
|
67
|
+
|
|
68
|
+
This extends to environment variables too. If `OPENAI_API_KEY` is set, we use it. No questions asked.
|
|
69
|
+
|
|
70
|
+
### Template Preview, Not Template Guessing
|
|
71
|
+
|
|
72
|
+
Instead of cryptic template names, we show exactly what users get:
|
|
73
|
+
|
|
74
|
+
```
|
|
75
|
+
📦 Minimal - Simple starting point
|
|
76
|
+
├── agent.py (50 lines) - Basic agent with example tool
|
|
77
|
+
├── .env - API key configuration
|
|
78
|
+
└── .co/ - Agent identity & metadata
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
**Why?** Users shouldn't have to guess. Show them, let them choose, move on.
|
|
82
|
+
|
|
83
|
+
### Silent Excellence: Auto-Generated Agent Keys
|
|
84
|
+
|
|
85
|
+
We generate cryptographic keys for agents automatically. No prompt, no explanation, just done.
|
|
86
|
+
|
|
87
|
+
```python
|
|
88
|
+
# This happens silently during init
|
|
89
|
+
addr_data = address.generate()
|
|
90
|
+
address.save(addr_data, co_dir)
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
**Why?** 99% of users don't care about Ed25519 vs secp256k1. The 1% who do can read the docs.
|
|
94
|
+
|
|
95
|
+
## The "No BS" Commitment
|
|
96
|
+
|
|
97
|
+
### What We Don't Ask
|
|
98
|
+
- Project description (write code first, document later)
|
|
99
|
+
- Author name (use git config if needed)
|
|
100
|
+
- License type (add it when you're ready to share)
|
|
101
|
+
- Version number (it's 0.0.1, always)
|
|
102
|
+
- Test framework (we include examples, you choose)
|
|
103
|
+
- Package manager (pip is fine)
|
|
104
|
+
|
|
105
|
+
### What We Do Instead
|
|
106
|
+
- Create working code immediately
|
|
107
|
+
- Use sensible defaults everywhere
|
|
108
|
+
- Show clear next steps
|
|
109
|
+
- Get out of the way
|
|
110
|
+
|
|
111
|
+
### Beautiful by Default
|
|
112
|
+
|
|
113
|
+
We use colors, emojis, and formatting not for decoration, but for clarity:
|
|
114
|
+
- ✅ Green = Success
|
|
115
|
+
- ⚠️ Yellow = Warning
|
|
116
|
+
- ❌ Red = Error
|
|
117
|
+
- 📁 Icons = Visual scanning
|
|
118
|
+
|
|
119
|
+
But we also respect terminal preferences:
|
|
120
|
+
- Works in non-color terminals
|
|
121
|
+
- Copy-paste friendly output
|
|
122
|
+
- No ASCII art or unnecessary flair
|
|
123
|
+
|
|
124
|
+
## Results: User Delight, Not User Fatigue
|
|
125
|
+
|
|
126
|
+
Our approach means:
|
|
127
|
+
- **30 seconds** from install to running agent
|
|
128
|
+
- **3 questions** maximum during setup
|
|
129
|
+
- **0 required** configuration files to edit
|
|
130
|
+
- **1 command** to start coding
|
|
131
|
+
|
|
132
|
+
Users consistently report that our CLI "just works" and "doesn't get in the way."
|
|
133
|
+
|
|
134
|
+
## Technical Implementation Notes
|
|
135
|
+
|
|
136
|
+
### Progressive Enhancement Pattern
|
|
137
|
+
```python
|
|
138
|
+
# Start with minimum viable
|
|
139
|
+
if not yes:
|
|
140
|
+
ai = click.confirm("Enable AI features?", default=True)
|
|
141
|
+
|
|
142
|
+
# Enhance if enabled
|
|
143
|
+
if ai:
|
|
144
|
+
templates.append('custom')
|
|
145
|
+
|
|
146
|
+
# But don't block progress
|
|
147
|
+
if not api_key:
|
|
148
|
+
# Still create project, just remind them later
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Fail Gracefully, Suggest Clearly
|
|
152
|
+
```python
|
|
153
|
+
if project_dir.exists():
|
|
154
|
+
click.echo(f"❌ Directory '{name}' already exists!")
|
|
155
|
+
click.echo(f"💡 Suggestions:")
|
|
156
|
+
click.echo(f" • Use different name: co create {name}-v2")
|
|
157
|
+
click.echo(f" • Remove existing: rm -rf {name}")
|
|
158
|
+
click.echo(f" • Initialize existing: cd {name} && co init")
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### Environment Intelligence
|
|
162
|
+
```python
|
|
163
|
+
# Check environment first, ask second
|
|
164
|
+
env_result = check_environment_for_api_keys()
|
|
165
|
+
if env_result:
|
|
166
|
+
click.echo(f"✓ Found {provider} API key in environment")
|
|
167
|
+
# Use it unless user objects
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
## Conclusion
|
|
171
|
+
|
|
172
|
+
Good CLI UX isn't about asking fewer questions - it's about asking the RIGHT questions at the RIGHT time. Everything else should be invisible, automatic, or optional.
|
|
173
|
+
|
|
174
|
+
Our CLI embodies this philosophy: Start fast, enhance progressively, respect user intelligence.
|
|
175
|
+
|
|
176
|
+
The best tool is one you forget you're using. That's what we built.
|