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.
Files changed (410) hide show
  1. connectonion/__init__.py +46 -9
  2. connectonion/cli/__init__.py +11 -1
  3. connectonion/cli/browser_agent/__init__.py +11 -1
  4. connectonion/cli/browser_agent/browser.py +13 -3
  5. connectonion/cli/browser_agent/element_finder.py +8 -0
  6. connectonion/cli/browser_agent/highlight_screenshot.py +9 -1
  7. connectonion/cli/browser_agent/scroll.py +8 -0
  8. connectonion/cli/co_ai/__init__.py +6 -0
  9. connectonion/cli/co_ai/agent.py +87 -0
  10. connectonion/cli/co_ai/agents/__init__.py +5 -0
  11. connectonion/cli/co_ai/agents/registry.py +57 -0
  12. connectonion/cli/co_ai/commands/__init__.py +45 -0
  13. connectonion/cli/co_ai/commands/compact.py +173 -0
  14. connectonion/cli/co_ai/commands/cost.py +77 -0
  15. connectonion/cli/co_ai/commands/export.py +60 -0
  16. connectonion/cli/co_ai/commands/help.py +80 -0
  17. connectonion/cli/co_ai/commands/init.py +101 -0
  18. connectonion/cli/co_ai/commands/sessions.py +55 -0
  19. connectonion/cli/co_ai/commands/tasks.py +63 -0
  20. connectonion/cli/co_ai/commands/undo.py +103 -0
  21. connectonion/cli/co_ai/context.py +127 -0
  22. connectonion/cli/co_ai/main.py +52 -0
  23. connectonion/cli/co_ai/plugins/__init__.py +5 -0
  24. connectonion/cli/co_ai/plugins/system_reminder.py +154 -0
  25. connectonion/cli/co_ai/prompts/agents/explore.md +79 -0
  26. connectonion/cli/co_ai/prompts/agents/plan.md +60 -0
  27. connectonion/cli/co_ai/prompts/assembler.py +303 -0
  28. connectonion/cli/{docs/co-vibecoding-principles-docs-contexts-all-in-one.md → co_ai/prompts/connectonion/README.md} +26 -0
  29. connectonion/cli/co_ai/prompts/connectonion/api.md +457 -0
  30. connectonion/cli/co_ai/prompts/connectonion/cli/README.md +805 -0
  31. connectonion/cli/co_ai/prompts/connectonion/cli/auth.md +46 -0
  32. connectonion/cli/co_ai/prompts/connectonion/cli/browser.md +235 -0
  33. connectonion/cli/co_ai/prompts/connectonion/cli/copy.md +184 -0
  34. connectonion/cli/co_ai/prompts/connectonion/cli/create.md +335 -0
  35. connectonion/cli/co_ai/prompts/connectonion/cli/init.md +431 -0
  36. connectonion/cli/co_ai/prompts/connectonion/co-directory-structure.md +214 -0
  37. connectonion/cli/co_ai/prompts/connectonion/concepts/agent.md +1078 -0
  38. connectonion/cli/co_ai/prompts/connectonion/concepts/events.md +816 -0
  39. connectonion/cli/co_ai/prompts/connectonion/concepts/llm_do.md +256 -0
  40. connectonion/cli/co_ai/prompts/connectonion/concepts/max_iterations.md +362 -0
  41. connectonion/cli/co_ai/prompts/connectonion/concepts/models.md +641 -0
  42. connectonion/cli/co_ai/prompts/connectonion/concepts/plugins.md +100 -0
  43. connectonion/cli/co_ai/prompts/connectonion/concepts/prompts.md +122 -0
  44. connectonion/cli/co_ai/prompts/connectonion/concepts/tools.md +512 -0
  45. connectonion/cli/co_ai/prompts/connectonion/concepts/transcribe.md +156 -0
  46. connectonion/cli/co_ai/prompts/connectonion/concepts/trust.md +291 -0
  47. connectonion/cli/co_ai/prompts/connectonion/debug/README.md +18 -0
  48. connectonion/cli/co_ai/prompts/connectonion/debug/auto_debug.md +1026 -0
  49. connectonion/cli/co_ai/prompts/connectonion/debug/console.md +129 -0
  50. connectonion/cli/co_ai/prompts/connectonion/debug/eval-format.md +178 -0
  51. connectonion/cli/co_ai/prompts/connectonion/debug/eval.md +230 -0
  52. connectonion/cli/co_ai/prompts/connectonion/debug/exceptions.md +307 -0
  53. connectonion/cli/co_ai/prompts/connectonion/debug/log.md +117 -0
  54. connectonion/cli/co_ai/prompts/connectonion/debug/xray.md +215 -0
  55. connectonion/cli/co_ai/prompts/connectonion/design-decisions/001-choosing-input-method.md +202 -0
  56. connectonion/cli/co_ai/prompts/connectonion/design-decisions/002-choosing-llm-function-name.md +202 -0
  57. connectonion/cli/co_ai/prompts/connectonion/design-decisions/003-choosing-trust-keyword.md +141 -0
  58. connectonion/cli/co_ai/prompts/connectonion/design-decisions/004-cli-create-flow.md +117 -0
  59. connectonion/cli/co_ai/prompts/connectonion/design-decisions/005-designing-agent-network-protocol.md +503 -0
  60. connectonion/cli/co_ai/prompts/connectonion/design-decisions/006-agent-address-format.md +305 -0
  61. connectonion/cli/co_ai/prompts/connectonion/design-decisions/007-authentication-backend-design.md +240 -0
  62. connectonion/cli/co_ai/prompts/connectonion/design-decisions/008-naming-is-hard.md +228 -0
  63. connectonion/cli/co_ai/prompts/connectonion/design-decisions/009-why-connect-function.md +167 -0
  64. connectonion/cli/co_ai/prompts/connectonion/design-decisions/010-cli-ux-progressive-disclosure.md +176 -0
  65. connectonion/cli/co_ai/prompts/connectonion/design-decisions/011-global-config-identity-management.md +357 -0
  66. connectonion/cli/co_ai/prompts/connectonion/design-decisions/012-tool-execution-separation.md +259 -0
  67. connectonion/cli/co_ai/prompts/connectonion/design-decisions/013-debug-and-logging-design.md +253 -0
  68. connectonion/cli/co_ai/prompts/connectonion/design-decisions/014-hook-system-design.md +510 -0
  69. connectonion/cli/co_ai/prompts/connectonion/design-decisions/015-interactive-auto-debug-design.md +837 -0
  70. connectonion/cli/co_ai/prompts/connectonion/design-decisions/016-why-no-zero-knowledge-proofs.md +358 -0
  71. connectonion/cli/co_ai/prompts/connectonion/design-decisions/017-session-logging-and-eval-format.md +120 -0
  72. connectonion/cli/co_ai/prompts/connectonion/design-decisions/018-event-api-naming.md +274 -0
  73. connectonion/cli/co_ai/prompts/connectonion/design-decisions/019-agent-lifecycle-design.md +655 -0
  74. connectonion/cli/co_ai/prompts/connectonion/design-decisions/020-trust-system-and-network-architecture.md +503 -0
  75. connectonion/cli/co_ai/prompts/connectonion/design-decisions/021-task-storage-jsonl-design.md +496 -0
  76. connectonion/cli/co_ai/prompts/connectonion/design-decisions/022-raw-asgi-implementation.md +273 -0
  77. connectonion/cli/co_ai/prompts/connectonion/examples/agent_reasoning.md +62 -0
  78. connectonion/cli/co_ai/prompts/connectonion/examples/atomic_tools.md +24 -0
  79. connectonion/cli/co_ai/prompts/connectonion/examples/load_guide.md +18 -0
  80. connectonion/cli/co_ai/prompts/connectonion/examples.md +0 -0
  81. connectonion/cli/co_ai/prompts/connectonion/hook-system-options.md +364 -0
  82. connectonion/cli/co_ai/prompts/connectonion/index.md +162 -0
  83. connectonion/cli/co_ai/prompts/connectonion/integrations/README.md +12 -0
  84. connectonion/cli/co_ai/prompts/connectonion/integrations/auth.md +450 -0
  85. connectonion/cli/co_ai/prompts/connectonion/integrations/google.md +431 -0
  86. connectonion/cli/co_ai/prompts/connectonion/integrations/microsoft.md +370 -0
  87. connectonion/cli/co_ai/prompts/connectonion/network/README.md +14 -0
  88. connectonion/cli/co_ai/prompts/connectonion/network/connect.md +543 -0
  89. connectonion/cli/co_ai/prompts/connectonion/network/connection.md +538 -0
  90. connectonion/cli/co_ai/prompts/connectonion/network/deploy.md +123 -0
  91. connectonion/cli/co_ai/prompts/connectonion/network/host.md +1049 -0
  92. connectonion/cli/co_ai/prompts/connectonion/network/protocol/agent-relay-protocol.md +495 -0
  93. connectonion/cli/co_ai/prompts/connectonion/network/protocol/announce-message.md +115 -0
  94. connectonion/cli/co_ai/prompts/connectonion/principles.md +124 -0
  95. connectonion/cli/co_ai/prompts/connectonion/quickstart.md +261 -0
  96. connectonion/cli/co_ai/prompts/connectonion/roadmap.md +81 -0
  97. connectonion/cli/co_ai/prompts/connectonion/templates/README.md +77 -0
  98. connectonion/cli/co_ai/prompts/connectonion/templates/meta-agent.md +152 -0
  99. connectonion/cli/co_ai/prompts/connectonion/templates/minimal.md +105 -0
  100. connectonion/cli/co_ai/prompts/connectonion/templates/playwright.md +130 -0
  101. connectonion/cli/co_ai/prompts/connectonion/templates/web-research.md +144 -0
  102. connectonion/cli/co_ai/prompts/connectonion/tui/README.md +95 -0
  103. connectonion/cli/co_ai/prompts/connectonion/tui/chat.md +181 -0
  104. connectonion/cli/co_ai/prompts/connectonion/tui/divider.md +63 -0
  105. connectonion/cli/co_ai/prompts/connectonion/tui/dropdown.md +83 -0
  106. connectonion/cli/co_ai/prompts/connectonion/tui/footer.md +44 -0
  107. connectonion/cli/co_ai/prompts/connectonion/tui/fuzzy.md +68 -0
  108. connectonion/cli/co_ai/prompts/connectonion/tui/input.md +84 -0
  109. connectonion/cli/co_ai/prompts/connectonion/tui/keys.md +77 -0
  110. connectonion/cli/co_ai/prompts/connectonion/tui/pick.md +71 -0
  111. connectonion/cli/co_ai/prompts/connectonion/tui/providers.md +89 -0
  112. connectonion/cli/co_ai/prompts/connectonion/tui/status_bar.md +67 -0
  113. connectonion/cli/co_ai/prompts/connectonion/useful_plugins/README.md +156 -0
  114. connectonion/cli/co_ai/prompts/connectonion/useful_plugins/calendar_plugin.md +68 -0
  115. connectonion/cli/co_ai/prompts/connectonion/useful_plugins/eval.md +89 -0
  116. connectonion/cli/co_ai/prompts/connectonion/useful_plugins/gmail_plugin.md +68 -0
  117. connectonion/cli/co_ai/prompts/connectonion/useful_plugins/image_result_formatter.md +74 -0
  118. connectonion/cli/co_ai/prompts/connectonion/useful_plugins/re_act.md +86 -0
  119. connectonion/cli/co_ai/prompts/connectonion/useful_plugins/shell_approval.md +69 -0
  120. connectonion/cli/co_ai/prompts/connectonion/useful_tools/README.md +81 -0
  121. connectonion/cli/co_ai/prompts/connectonion/useful_tools/diff_writer.md +138 -0
  122. connectonion/cli/co_ai/prompts/connectonion/useful_tools/get_emails.md +499 -0
  123. connectonion/cli/co_ai/prompts/connectonion/useful_tools/gmail.md +135 -0
  124. connectonion/cli/co_ai/prompts/connectonion/useful_tools/google_calendar.md +106 -0
  125. connectonion/cli/co_ai/prompts/connectonion/useful_tools/memory.md +486 -0
  126. connectonion/cli/co_ai/prompts/connectonion/useful_tools/microsoft_calendar.md +106 -0
  127. connectonion/cli/co_ai/prompts/connectonion/useful_tools/outlook.md +120 -0
  128. connectonion/cli/co_ai/prompts/connectonion/useful_tools/send_email.md +403 -0
  129. connectonion/cli/co_ai/prompts/connectonion/useful_tools/shell.md +95 -0
  130. connectonion/cli/co_ai/prompts/connectonion/useful_tools/slash_command.md +96 -0
  131. connectonion/cli/co_ai/prompts/connectonion/useful_tools/terminal.md +97 -0
  132. connectonion/cli/co_ai/prompts/connectonion/useful_tools/todo_list.md +252 -0
  133. connectonion/cli/co_ai/prompts/connectonion/useful_tools/web_fetch.md +130 -0
  134. connectonion/cli/co_ai/prompts/connectonion/vibe-coding-guide.md +97 -0
  135. connectonion/cli/co_ai/prompts/connectonion/windows-support.md +258 -0
  136. connectonion/cli/co_ai/prompts/main.md +247 -0
  137. connectonion/cli/co_ai/prompts/summarization.md +55 -0
  138. connectonion/cli/co_ai/prompts/system-reminders/agent.md +23 -0
  139. connectonion/cli/co_ai/prompts/system-reminders/plan_mode.md +13 -0
  140. connectonion/cli/co_ai/prompts/system-reminders/security.md +14 -0
  141. connectonion/cli/co_ai/prompts/system-reminders/simplicity.md +14 -0
  142. connectonion/cli/co_ai/prompts/tools/ask_user.md +61 -0
  143. connectonion/cli/co_ai/prompts/tools/background.md +57 -0
  144. connectonion/cli/co_ai/prompts/tools/edit.md +90 -0
  145. connectonion/cli/co_ai/prompts/tools/glob.md +52 -0
  146. connectonion/cli/co_ai/prompts/tools/grep.md +55 -0
  147. connectonion/cli/co_ai/prompts/tools/plan_mode.md +80 -0
  148. connectonion/cli/co_ai/prompts/tools/read.md +40 -0
  149. connectonion/cli/co_ai/prompts/tools/shell.md +67 -0
  150. connectonion/cli/co_ai/prompts/tools/task.md +51 -0
  151. connectonion/cli/co_ai/prompts/tools/todo.md +139 -0
  152. connectonion/cli/co_ai/prompts/tools/write.md +47 -0
  153. connectonion/cli/co_ai/prompts/workflow.md +89 -0
  154. connectonion/cli/co_ai/sessions.py +110 -0
  155. connectonion/cli/co_ai/skills/__init__.py +37 -0
  156. connectonion/cli/co_ai/skills/builtin/commit/SKILL.md +63 -0
  157. connectonion/cli/co_ai/skills/builtin/review-pr/SKILL.md +76 -0
  158. connectonion/cli/co_ai/skills/loader.py +166 -0
  159. connectonion/cli/co_ai/skills/tool.py +46 -0
  160. connectonion/cli/co_ai/tools/__init__.py +92 -0
  161. connectonion/cli/co_ai/tools/ask_user.py +35 -0
  162. connectonion/cli/co_ai/tools/background.py +201 -0
  163. connectonion/cli/co_ai/tools/diff_writer.py +291 -0
  164. connectonion/cli/co_ai/tools/edit.py +89 -0
  165. connectonion/cli/co_ai/tools/glob.py +84 -0
  166. connectonion/cli/co_ai/tools/grep.py +158 -0
  167. connectonion/cli/co_ai/tools/load_guide.py +23 -0
  168. connectonion/cli/co_ai/tools/multi_edit.py +116 -0
  169. connectonion/cli/co_ai/tools/plan_mode.py +169 -0
  170. connectonion/cli/co_ai/tools/read.py +61 -0
  171. connectonion/cli/co_ai/tools/task.py +59 -0
  172. connectonion/cli/co_ai/tools/todo_list.py +159 -0
  173. connectonion/cli/co_ai/tools/write.py +126 -0
  174. connectonion/cli/commands/__init__.py +11 -1
  175. connectonion/cli/commands/ai_commands.py +34 -0
  176. connectonion/cli/commands/copy_commands.py +55 -6
  177. connectonion/cli/commands/create.py +20 -17
  178. connectonion/cli/commands/init.py +19 -22
  179. connectonion/cli/commands/project_cmd_lib.py +15 -0
  180. connectonion/cli/main.py +11 -0
  181. connectonion/console.py +15 -1
  182. connectonion/core/__init__.py +10 -1
  183. connectonion/core/agent.py +37 -16
  184. connectonion/core/exceptions.py +74 -0
  185. connectonion/core/llm.py +54 -6
  186. connectonion/core/tool_executor.py +32 -31
  187. connectonion/core/tool_factory.py +47 -10
  188. connectonion/debug/__init__.py +10 -1
  189. connectonion/debug/debug_explainer/__init__.py +10 -1
  190. connectonion/debug/execution_analyzer/__init__.py +10 -1
  191. connectonion/debug/execution_analyzer/execution_analysis.py +5 -2
  192. connectonion/debug/runtime_inspector/__init__.py +10 -1
  193. connectonion/docs/.package-ignore +6 -0
  194. connectonion/docs/README.md +2036 -0
  195. connectonion/docs/api.md +457 -0
  196. connectonion/docs/archive/001-ai-agent-is-just-prompt-plus-function.md +249 -0
  197. connectonion/docs/archive/README.md +53 -0
  198. connectonion/docs/archive/archive/consolidation-plan.md +72 -0
  199. connectonion/docs/archive/archive/core-principles-extracted.md +239 -0
  200. connectonion/docs/archive/archive/master-principles.md +222 -0
  201. connectonion/docs/archive/archive/principles.md +293 -0
  202. connectonion/docs/archive/archive/simplicity-principles.md +221 -0
  203. connectonion/docs/archive/attack-defense-insights.md +410 -0
  204. connectonion/docs/archive/business-model.md +305 -0
  205. connectonion/docs/archive/core-principles-unified.md +190 -0
  206. connectonion/docs/archive/discussion-journey.md +178 -0
  207. connectonion/docs/archive/economic-analysis.md +323 -0
  208. connectonion/docs/archive/features/01-share-and-find.md +256 -0
  209. connectonion/docs/archive/features/02-agent-authentication.md +93 -0
  210. connectonion/docs/archive/features/03-test-before-trust.md +71 -0
  211. connectonion/docs/archive/features/06-reliability-and-offline.md +197 -0
  212. connectonion/docs/archive/features/README.md +46 -0
  213. connectonion/docs/archive/features-roadmap.md +247 -0
  214. connectonion/docs/archive/mcp-comparison-insights.md +215 -0
  215. connectonion/docs/archive/migration-strategy.md +571 -0
  216. connectonion/docs/archive/mini-whitepaper.md +293 -0
  217. connectonion/docs/archive/network-protocol.md +394 -0
  218. connectonion/docs/archive/semantic-revolution.md +367 -0
  219. connectonion/docs/archive/technical-architecture.md +453 -0
  220. connectonion/docs/archive/the-semantic-insight.md +207 -0
  221. connectonion/docs/archive/threat-model.md +164 -0
  222. connectonion/docs/cli/README.md +805 -0
  223. connectonion/docs/cli/auth.md +46 -0
  224. connectonion/docs/cli/browser.md +235 -0
  225. connectonion/docs/cli/copy.md +232 -0
  226. connectonion/docs/cli/create.md +335 -0
  227. connectonion/docs/cli/init.md +431 -0
  228. connectonion/docs/co-directory-structure.md +214 -0
  229. connectonion/docs/concepts/agent.md +1078 -0
  230. connectonion/docs/concepts/events.md +699 -0
  231. connectonion/docs/concepts/llm_do.md +256 -0
  232. connectonion/docs/concepts/max_iterations.md +362 -0
  233. connectonion/docs/concepts/models.md +641 -0
  234. connectonion/docs/concepts/plugins.md +101 -0
  235. connectonion/docs/concepts/prompts.md +122 -0
  236. connectonion/docs/concepts/session.md +428 -0
  237. connectonion/docs/concepts/tools.md +512 -0
  238. connectonion/docs/concepts/transcribe.md +156 -0
  239. connectonion/docs/concepts/trust.md +291 -0
  240. connectonion/docs/connectonion.md +1256 -0
  241. connectonion/docs/debug/README.md +18 -0
  242. connectonion/docs/debug/auto_debug.md +1026 -0
  243. connectonion/docs/debug/console.md +129 -0
  244. connectonion/docs/debug/eval-format.md +178 -0
  245. connectonion/docs/debug/eval.md +230 -0
  246. connectonion/docs/debug/exceptions.md +307 -0
  247. connectonion/docs/debug/log.md +117 -0
  248. connectonion/docs/debug/xray.md +215 -0
  249. connectonion/docs/design-decisions/001-choosing-input-method.md +202 -0
  250. connectonion/docs/design-decisions/002-choosing-llm-function-name.md +202 -0
  251. connectonion/docs/design-decisions/003-choosing-trust-keyword.md +141 -0
  252. connectonion/docs/design-decisions/004-cli-create-flow.md +117 -0
  253. connectonion/docs/design-decisions/005-designing-agent-network-protocol.md +503 -0
  254. connectonion/docs/design-decisions/006-agent-address-format.md +305 -0
  255. connectonion/docs/design-decisions/007-authentication-backend-design.md +240 -0
  256. connectonion/docs/design-decisions/008-naming-is-hard.md +228 -0
  257. connectonion/docs/design-decisions/009-why-connect-function.md +167 -0
  258. connectonion/docs/design-decisions/010-cli-ux-progressive-disclosure.md +176 -0
  259. connectonion/docs/design-decisions/011-global-config-identity-management.md +357 -0
  260. connectonion/docs/design-decisions/012-tool-execution-separation.md +259 -0
  261. connectonion/docs/design-decisions/013-debug-and-logging-design.md +253 -0
  262. connectonion/docs/design-decisions/014-hook-system-design.md +510 -0
  263. connectonion/docs/design-decisions/015-interactive-auto-debug-design.md +837 -0
  264. connectonion/docs/design-decisions/016-why-no-zero-knowledge-proofs.md +358 -0
  265. connectonion/docs/design-decisions/017-session-logging-and-eval-format.md +120 -0
  266. connectonion/docs/design-decisions/018-event-api-naming.md +274 -0
  267. connectonion/docs/design-decisions/019-agent-lifecycle-design.md +655 -0
  268. connectonion/docs/design-decisions/020-trust-system-and-network-architecture.md +503 -0
  269. connectonion/docs/design-decisions/021-task-storage-jsonl-design.md +496 -0
  270. connectonion/docs/design-decisions/022-raw-asgi-implementation.md +273 -0
  271. connectonion/docs/examples.md +0 -0
  272. connectonion/docs/hook-system-options.md +364 -0
  273. connectonion/docs/integrations/README.md +12 -0
  274. connectonion/docs/integrations/auth.md +450 -0
  275. connectonion/docs/integrations/google.md +431 -0
  276. connectonion/docs/integrations/microsoft.md +370 -0
  277. connectonion/docs/network/README.md +14 -0
  278. connectonion/docs/network/connect.md +629 -0
  279. connectonion/docs/network/deploy.md +124 -0
  280. connectonion/docs/network/host.md +1087 -0
  281. connectonion/docs/network/io.md +538 -0
  282. connectonion/docs/network/protocol/agent-relay-protocol.md +495 -0
  283. connectonion/docs/network/protocol/announce-message.md +115 -0
  284. connectonion/docs/principles.md +124 -0
  285. connectonion/docs/quickstart.md +261 -0
  286. connectonion/docs/roadmap.md +81 -0
  287. connectonion/docs/templates/README.md +77 -0
  288. connectonion/docs/templates/meta-agent.md +152 -0
  289. connectonion/docs/templates/minimal.md +105 -0
  290. connectonion/docs/templates/playwright.md +130 -0
  291. connectonion/docs/templates/web-research.md +144 -0
  292. connectonion/docs/tui/README.md +95 -0
  293. connectonion/docs/tui/chat.md +181 -0
  294. connectonion/docs/tui/divider.md +63 -0
  295. connectonion/docs/tui/dropdown.md +83 -0
  296. connectonion/docs/tui/footer.md +44 -0
  297. connectonion/docs/tui/fuzzy.md +68 -0
  298. connectonion/docs/tui/input.md +84 -0
  299. connectonion/docs/tui/keys.md +77 -0
  300. connectonion/docs/tui/pick.md +71 -0
  301. connectonion/docs/tui/providers.md +89 -0
  302. connectonion/docs/tui/status_bar.md +67 -0
  303. connectonion/docs/useful_plugins/README.md +160 -0
  304. connectonion/docs/useful_plugins/calendar_plugin.md +68 -0
  305. connectonion/docs/useful_plugins/eval.md +89 -0
  306. connectonion/docs/useful_plugins/gmail_plugin.md +68 -0
  307. connectonion/docs/useful_plugins/image_result_formatter.md +74 -0
  308. connectonion/docs/useful_plugins/re_act.md +86 -0
  309. connectonion/docs/useful_plugins/shell_approval.md +69 -0
  310. connectonion/docs/useful_plugins/system_reminder.md +210 -0
  311. connectonion/docs/useful_plugins/tool_approval.md +139 -0
  312. connectonion/docs/useful_prompts/README.md +127 -0
  313. connectonion/docs/useful_prompts/coding_agent.md +214 -0
  314. connectonion/docs/useful_tools/README.md +81 -0
  315. connectonion/docs/useful_tools/ask_user.md +103 -0
  316. connectonion/docs/useful_tools/diff_writer.md +158 -0
  317. connectonion/docs/useful_tools/get_emails.md +519 -0
  318. connectonion/docs/useful_tools/gmail.md +155 -0
  319. connectonion/docs/useful_tools/google_calendar.md +126 -0
  320. connectonion/docs/useful_tools/memory.md +506 -0
  321. connectonion/docs/useful_tools/microsoft_calendar.md +126 -0
  322. connectonion/docs/useful_tools/outlook.md +140 -0
  323. connectonion/docs/useful_tools/send_email.md +423 -0
  324. connectonion/docs/useful_tools/shell.md +115 -0
  325. connectonion/docs/useful_tools/slash_command.md +116 -0
  326. connectonion/docs/useful_tools/terminal.md +115 -0
  327. connectonion/docs/useful_tools/todo_list.md +272 -0
  328. connectonion/docs/useful_tools/web_fetch.md +150 -0
  329. connectonion/docs/vibe-coding-guide.md +97 -0
  330. connectonion/docs/windows-support.md +258 -0
  331. connectonion/logger.py +3 -3
  332. connectonion/network/__init__.py +19 -6
  333. connectonion/network/asgi/__init__.py +81 -0
  334. connectonion/network/asgi/http.py +205 -0
  335. connectonion/network/asgi/websocket.py +217 -0
  336. connectonion/network/connect.py +232 -185
  337. connectonion/network/host/__init__.py +59 -0
  338. connectonion/network/host/auth.py +191 -0
  339. connectonion/network/host/routes.py +135 -0
  340. connectonion/network/host/server.py +289 -0
  341. connectonion/network/host/session.py +78 -0
  342. connectonion/network/io/__init__.py +21 -0
  343. connectonion/network/{connection.py → io/base.py} +17 -42
  344. connectonion/network/io/websocket.py +55 -0
  345. connectonion/network/relay.py +37 -16
  346. connectonion/network/trust/__init__.py +30 -0
  347. connectonion/network/trust/factory.py +138 -0
  348. connectonion/network/{trust_agents.py → trust/prompts.py} +3 -3
  349. connectonion/network/{trust_functions.py → trust/tools.py} +2 -2
  350. connectonion/prompt_files/__init__.py +11 -1
  351. connectonion/prompt_files/react_acknowledge.md +26 -0
  352. connectonion/prompts.py +10 -1
  353. connectonion/tui/chat.py +10 -1
  354. connectonion/tui/divider.py +10 -1
  355. connectonion/tui/dropdown.py +10 -1
  356. connectonion/tui/footer.py +8 -0
  357. connectonion/tui/fuzzy.py +11 -1
  358. connectonion/tui/input.py +118 -70
  359. connectonion/tui/keys.py +133 -6
  360. connectonion/tui/providers.py +11 -1
  361. connectonion/tui/status_bar.py +10 -1
  362. connectonion/useful_events_handlers/__init__.py +8 -0
  363. connectonion/useful_events_handlers/reflect.py +19 -4
  364. connectonion/useful_plugins/__init__.py +3 -1
  365. connectonion/useful_plugins/eval.py +2 -2
  366. connectonion/useful_plugins/gmail_plugin.py +3 -3
  367. connectonion/useful_plugins/image_result_formatter.py +3 -3
  368. connectonion/useful_plugins/re_act.py +114 -28
  369. connectonion/useful_plugins/shell_approval.py +2 -2
  370. connectonion/useful_plugins/system_reminder.py +103 -0
  371. connectonion/useful_plugins/tool_approval.py +233 -0
  372. connectonion/useful_plugins/ui_stream.py +18 -133
  373. connectonion/useful_prompts/README.md +61 -0
  374. connectonion/useful_prompts/__init__.py +45 -0
  375. connectonion/useful_prompts/coding_agent/README.md +106 -0
  376. connectonion/useful_prompts/coding_agent/assembler.py +123 -0
  377. connectonion/useful_prompts/coding_agent/prompts/main.md +227 -0
  378. connectonion/useful_prompts/coding_agent/prompts/tools/ask_user.md +61 -0
  379. connectonion/useful_prompts/coding_agent/prompts/tools/background.md +57 -0
  380. connectonion/useful_prompts/coding_agent/prompts/tools/edit.md +90 -0
  381. connectonion/useful_prompts/coding_agent/prompts/tools/glob.md +52 -0
  382. connectonion/useful_prompts/coding_agent/prompts/tools/grep.md +55 -0
  383. connectonion/useful_prompts/coding_agent/prompts/tools/plan_mode.md +80 -0
  384. connectonion/useful_prompts/coding_agent/prompts/tools/read.md +40 -0
  385. connectonion/useful_prompts/coding_agent/prompts/tools/shell.md +67 -0
  386. connectonion/useful_prompts/coding_agent/prompts/tools/task.md +51 -0
  387. connectonion/useful_prompts/coding_agent/prompts/tools/todo.md +139 -0
  388. connectonion/useful_prompts/coding_agent/prompts/tools/write.md +48 -0
  389. connectonion/useful_prompts/system-reminders/security-warning.md +14 -0
  390. connectonion/useful_prompts/system-reminders/test-reminder.md +11 -0
  391. connectonion/useful_tools/__init__.py +31 -4
  392. connectonion/useful_tools/ask_user.py +35 -0
  393. connectonion/useful_tools/bash.py +69 -0
  394. connectonion/useful_tools/diff_writer.py +186 -94
  395. connectonion/useful_tools/edit.py +102 -0
  396. connectonion/useful_tools/glob_files.py +97 -0
  397. connectonion/useful_tools/grep_files.py +171 -0
  398. connectonion/useful_tools/multi_edit.py +116 -0
  399. connectonion/useful_tools/read_file.py +73 -0
  400. connectonion/useful_tools/shell.py +50 -45
  401. connectonion/useful_tools/write_file.py +129 -0
  402. {connectonion-0.6.2.dist-info → connectonion-0.6.4.dist-info}/METADATA +10 -3
  403. connectonion-0.6.4.dist-info/RECORD +472 -0
  404. connectonion/network/asgi.py +0 -407
  405. connectonion/network/host.py +0 -616
  406. connectonion/network/trust.py +0 -166
  407. connectonion-0.6.2.dist-info/RECORD +0 -129
  408. /connectonion/cli/{docs → co_ai/prompts/connectonion}/connectonion.md +0 -0
  409. {connectonion-0.6.2.dist-info → connectonion-0.6.4.dist-info}/WHEEL +0 -0
  410. {connectonion-0.6.2.dist-info → connectonion-0.6.4.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,159 @@
1
+ """
2
+ Purpose: Web-friendly todo tracking tool that emits updates via io
3
+ LLM-Note:
4
+ Dependencies: imports from [typing, dataclasses] | imported by [co_ai.tools.__init__]
5
+ Data flow: Agent calls TodoList methods -> updates internal list -> emits todo_update via io -> returns status string
6
+ State/Effects: maintains in-memory list of TodoItem objects | sends updates via io | no console output
7
+ Integration: exposes TodoList class with add(content, active_form), start(content), complete(content), remove(content), list(), update(todos), clear()
8
+ """
9
+
10
+ from typing import List, Literal, Optional
11
+ from dataclasses import dataclass
12
+
13
+
14
+ @dataclass
15
+ class TodoItem:
16
+ """A single todo item."""
17
+ content: str
18
+ status: Literal["pending", "in_progress", "completed"]
19
+ active_form: str
20
+
21
+
22
+ class TodoList:
23
+ """Task tracking tool for agents (web-first)."""
24
+
25
+ def __init__(self):
26
+ self._todos: List[TodoItem] = []
27
+ self.io = None
28
+
29
+ def add(self, content: str, active_form: str) -> str:
30
+ """Add a new todo item."""
31
+ if self._find(content):
32
+ return f"Todo already exists: {content}"
33
+
34
+ self._todos.append(TodoItem(
35
+ content=content,
36
+ status="pending",
37
+ active_form=active_form
38
+ ))
39
+ self._emit()
40
+ return f"Added: {content}"
41
+
42
+ def start(self, content: str) -> str:
43
+ """Mark a todo as in_progress."""
44
+ item = self._find(content)
45
+ if not item:
46
+ return f"Todo not found: {content}"
47
+
48
+ if item.status == "completed":
49
+ return f"Cannot start completed todo: {content}"
50
+
51
+ in_progress = [t for t in self._todos if t.status == "in_progress"]
52
+ if in_progress and in_progress[0].content != content:
53
+ return f"Another task is in progress: {in_progress[0].content}. Complete it first."
54
+
55
+ item.status = "in_progress"
56
+ self._emit()
57
+ return f"Started: {item.active_form}"
58
+
59
+ def complete(self, content: str) -> str:
60
+ """Mark a todo as completed."""
61
+ item = self._find(content)
62
+ if not item:
63
+ return f"Todo not found: {content}"
64
+
65
+ item.status = "completed"
66
+ self._emit()
67
+ return f"Completed: {content}"
68
+
69
+ def remove(self, content: str) -> str:
70
+ """Remove a todo from the list."""
71
+ item = self._find(content)
72
+ if not item:
73
+ return f"Todo not found: {content}"
74
+
75
+ self._todos.remove(item)
76
+ self._emit()
77
+ return f"Removed: {content}"
78
+
79
+ def list(self) -> str:
80
+ """Get all todos as formatted text."""
81
+ if not self._todos:
82
+ return "No todos"
83
+
84
+ lines = []
85
+ for item in self._todos:
86
+ status_icon = self._status_icon(item.status)
87
+ lines.append(f"{status_icon} {item.content}")
88
+
89
+ return "\n".join(lines)
90
+
91
+ def update(self, todos: List[dict]) -> str:
92
+ """Replace entire todo list (for bulk updates)."""
93
+ self._todos = []
94
+ for t in todos:
95
+ self._todos.append(TodoItem(
96
+ content=t["content"],
97
+ status=t["status"],
98
+ active_form=t.get("active_form", t["content"] + "...")
99
+ ))
100
+ self._emit()
101
+ return f"Updated {len(self._todos)} todos"
102
+
103
+ def clear(self) -> str:
104
+ """Clear all todos."""
105
+ count = len(self._todos)
106
+ self._todos = []
107
+ self._emit()
108
+ return f"Cleared {count} todos"
109
+
110
+ def _find(self, content: str) -> Optional[TodoItem]:
111
+ """Find todo by content."""
112
+ for item in self._todos:
113
+ if item.content == content:
114
+ return item
115
+ return None
116
+
117
+ def _status_icon(self, status: str) -> str:
118
+ """Get icon for status (ASCII)."""
119
+ return {
120
+ "pending": "[ ]",
121
+ "in_progress": "[>]",
122
+ "completed": "[x]"
123
+ }.get(status, "[ ]")
124
+
125
+ def _emit(self) -> None:
126
+ """Emit todo updates to io (best-effort)."""
127
+ if not self.io:
128
+ return
129
+
130
+ payload = {
131
+ "type": "todo_update",
132
+ "todos": [
133
+ {
134
+ "content": t.content,
135
+ "status": t.status,
136
+ "active_form": t.active_form
137
+ }
138
+ for t in self._todos
139
+ ],
140
+ "progress": self.progress,
141
+ "current_task": self.current_task,
142
+ }
143
+ self.io.send(payload)
144
+
145
+ @property
146
+ def progress(self) -> float:
147
+ """Get progress as percentage (0.0 to 1.0)."""
148
+ if not self._todos:
149
+ return 1.0
150
+ completed = sum(1 for t in self._todos if t.status == "completed")
151
+ return completed / len(self._todos)
152
+
153
+ @property
154
+ def current_task(self) -> Optional[str]:
155
+ """Get the currently in_progress task."""
156
+ for item in self._todos:
157
+ if item.status == "in_progress":
158
+ return item.active_form
159
+ return None
@@ -0,0 +1,126 @@
1
+ """
2
+ Purpose: Write file tool with Claude Code-style approval (web mode)
3
+ LLM-Note:
4
+ Dependencies: imports from [.diff_writer] | imported by [co_ai.tools.__init__]
5
+ Data flow: Agent calls write(path, content) -> DiffWriter handles approval via io -> writes file
6
+ State/Effects: writes file to filesystem | sends events via io for approval
7
+ Integration: exposes write(path, content) function and Write class | used as agent tool
8
+
9
+ This is a wrapper around DiffWriter for simpler function-based usage.
10
+ For class-based usage with mode control, use DiffWriter directly.
11
+ """
12
+
13
+ from pathlib import Path
14
+ from typing import Optional
15
+
16
+ from .diff_writer import DiffWriter, MODE_NORMAL, MODE_AUTO, MODE_PLAN
17
+
18
+
19
+ # Global writer instance for function-based API
20
+ _writer: Optional[DiffWriter] = None
21
+
22
+
23
+ def _get_writer() -> DiffWriter:
24
+ """Get or create the global writer instance."""
25
+ global _writer
26
+ if _writer is None:
27
+ _writer = DiffWriter(mode=MODE_AUTO) # Default to auto for function API
28
+ return _writer
29
+
30
+
31
+ def write(path: str, content: str) -> str:
32
+ """
33
+ Write content to a file (full overwrite).
34
+
35
+ For new files or when replacing most of the content.
36
+ Use edit() for small, targeted changes instead.
37
+
38
+ Args:
39
+ path: File path to write to
40
+ content: Complete file content
41
+
42
+ Returns:
43
+ Success message or error description
44
+
45
+ Examples:
46
+ write("new_file.py", "print('hello')")
47
+ write("config.json", '{"debug": true}')
48
+ """
49
+ writer = _get_writer()
50
+ return writer.write(path, content)
51
+
52
+
53
+ class Write:
54
+ """File writer with Claude Code-style permission modes (web mode).
55
+
56
+ Use this class when you need mode control (normal/auto/plan).
57
+ For simple writes, use the write() function instead.
58
+
59
+ Usage:
60
+ writer = Write(mode="normal") # Prompt for every write
61
+ writer = Write(mode="auto") # Auto-approve all writes
62
+ writer = Write(mode="plan") # Read-only, preview only
63
+ """
64
+
65
+ def __init__(self, mode: str = MODE_NORMAL):
66
+ """Initialize Write tool.
67
+
68
+ Args:
69
+ mode: Permission mode - "normal" (prompt), "auto" (auto-approve), "plan" (read-only)
70
+ """
71
+ self._writer = DiffWriter(mode=mode)
72
+
73
+ @property
74
+ def io(self):
75
+ """IO channel for web mode."""
76
+ return self._writer.io
77
+
78
+ @io.setter
79
+ def io(self, value):
80
+ """Set IO channel."""
81
+ self._writer.io = value
82
+
83
+ @property
84
+ def mode(self):
85
+ """Current permission mode."""
86
+ return self._writer.mode
87
+
88
+ @mode.setter
89
+ def mode(self, value):
90
+ """Set permission mode."""
91
+ self._writer.mode = value
92
+
93
+ def write(self, path: str, content: str) -> str:
94
+ """Write content to a file with approval.
95
+
96
+ Args:
97
+ path: File path to write to
98
+ content: Complete file content
99
+
100
+ Returns:
101
+ Success message, rejection with feedback, or plan mode preview
102
+ """
103
+ return self._writer.write(path, content)
104
+
105
+ def diff(self, path: str, content: str) -> str:
106
+ """Show diff without writing (preview mode).
107
+
108
+ Args:
109
+ path: File path to compare against
110
+ content: New content to compare
111
+
112
+ Returns:
113
+ Diff string in unified format
114
+ """
115
+ return self._writer.diff(path, content)
116
+
117
+ def read(self, path: str) -> str:
118
+ """Read file contents.
119
+
120
+ Args:
121
+ path: File path to read
122
+
123
+ Returns:
124
+ File contents or error message
125
+ """
126
+ return self._writer.read(path)
@@ -1 +1,11 @@
1
- """Command modules for ConnectOnion CLI."""
1
+ """
2
+ Purpose: CLI command modules namespace
3
+ LLM-Note:
4
+ Dependencies: none | imported by [cli/main.py] | no direct tests
5
+ Data flow: no exports (commands imported directly from submodules)
6
+ State/Effects: no state
7
+ Integration: namespace package for auth_commands, browser_commands, create, deploy_commands, doctor_commands, eval_commands, init, status_commands, etc.
8
+ Performance: trivial
9
+ Errors: none
10
+ Command modules for ConnectOnion CLI.
11
+ """
@@ -0,0 +1,34 @@
1
+ """
2
+ Purpose: AI coding agent CLI command
3
+ LLM-Note:
4
+ Dependencies: imports from [cli/co_ai/main.py] | imported by [cli/main.py] | no direct tests
5
+ Data flow: CLI args → start_server(port, model, max_iterations) → co_ai.main.start_server()
6
+ Integration: exposes handle_ai() | called from main.py as 'co ai' command
7
+ """
8
+
9
+ from rich.console import Console
10
+
11
+ console = Console()
12
+
13
+
14
+ def handle_ai(
15
+ port: int = 8000,
16
+ model: str = "co/claude-opus-4-5",
17
+ max_iterations: int = 20,
18
+ ):
19
+ """Start AI coding agent web server.
20
+
21
+ Args:
22
+ port: Port to run server on
23
+ model: LLM model to use
24
+ max_iterations: Max tool calling iterations
25
+
26
+ Examples:
27
+ co ai # Start on port 8000
28
+ co ai --port 3001 # Custom port
29
+ co ai --model co/gpt-5 # Different model
30
+ """
31
+ from ..co_ai.main import start_server
32
+
33
+ console.print(f"[green]Starting AI coding agent on port {port}...[/]")
34
+ start_server(port=port, model=model, max_iterations=max_iterations)
@@ -1,9 +1,9 @@
1
1
  """
2
- Purpose: CLI command to copy built-in tools and plugins to user's project for customization
2
+ Purpose: CLI command to copy built-in tools, plugins, and prompts to user's project for customization
3
3
  LLM-Note:
4
4
  Dependencies: imports from [shutil, pathlib, typing, rich] | imported by [cli/main.py via handle_copy()]
5
- Data flow: user runs `co copy <name>` → looks up name in TOOLS/PLUGINS registry → finds source via module.__file__ → copies to ./tools/ or ./plugins/
6
- State/Effects: creates tools/ or plugins/ directory if needed | copies .py files from installed package to user's project
5
+ Data flow: user runs `co copy <name>` → looks up name in TOOLS/PLUGINS/PROMPTS registry → finds source via module.__file__ → copies to ./tools/, ./plugins/, or ./prompts/
6
+ State/Effects: creates tools/, plugins/, or prompts/ directory if needed | copies files/directories from installed package to user's project
7
7
  Integration: exposes handle_copy() for CLI | uses Python import system to find installed package location (cross-platform)
8
8
  """
9
9
 
@@ -17,6 +17,7 @@ console = Console()
17
17
 
18
18
  # Registry of copyable tools
19
19
  TOOLS = {
20
+ "ask_user": "ask_user.py",
20
21
  "gmail": "gmail.py",
21
22
  "outlook": "outlook.py",
22
23
  "google_calendar": "google_calendar.py",
@@ -37,6 +38,12 @@ PLUGINS = {
37
38
  "shell_approval": "shell_approval.py",
38
39
  "gmail_plugin": "gmail_plugin.py",
39
40
  "calendar_plugin": "calendar_plugin.py",
41
+ "system_reminder": "system_reminder.py",
42
+ }
43
+
44
+ # Plugins that also need prompts copied
45
+ PLUGIN_PROMPTS = {
46
+ "system_reminder": "system-reminders",
40
47
  }
41
48
 
42
49
  # Registry of copyable TUI components
@@ -51,6 +58,11 @@ TUI = {
51
58
  "keys": "keys.py",
52
59
  }
53
60
 
61
+ # Registry of copyable prompt templates (directories)
62
+ PROMPTS = {
63
+ "coding_agent": "coding_agent",
64
+ }
65
+
54
66
 
55
67
  def handle_copy(
56
68
  names: List[str],
@@ -58,7 +70,7 @@ def handle_copy(
58
70
  path: Optional[str] = None,
59
71
  force: bool = False
60
72
  ):
61
- """Copy built-in tools and plugins to user's project."""
73
+ """Copy built-in tools, plugins, and prompts to user's project."""
62
74
 
63
75
  # Show list if requested or no names provided
64
76
  if list_all or not names:
@@ -69,10 +81,12 @@ def handle_copy(
69
81
  import connectonion.useful_tools as tools_module
70
82
  import connectonion.useful_plugins as plugins_module
71
83
  import connectonion.tui as tui_module
84
+ import connectonion.useful_prompts as prompts_module
72
85
 
73
86
  useful_tools_dir = Path(tools_module.__file__).parent
74
87
  useful_plugins_dir = Path(plugins_module.__file__).parent
75
88
  tui_dir = Path(tui_module.__file__).parent
89
+ useful_prompts_dir = Path(prompts_module.__file__).parent
76
90
 
77
91
  current_dir = Path.cwd()
78
92
 
@@ -91,12 +105,24 @@ def handle_copy(
91
105
  dest_dir = Path(path) if path else current_dir / "plugins"
92
106
  copy_file(source, dest_dir, force)
93
107
 
108
+ # Also copy associated prompts if any
109
+ if name_lower in PLUGIN_PROMPTS:
110
+ prompt_source = useful_prompts_dir / PLUGIN_PROMPTS[name_lower]
111
+ prompt_dest = Path(path) if path else current_dir / "prompts"
112
+ copy_directory(prompt_source, prompt_dest, force)
113
+
94
114
  # Check if it's a TUI component
95
115
  elif name_lower in TUI:
96
116
  source = tui_dir / TUI[name_lower]
97
117
  dest_dir = Path(path) if path else current_dir / "tui"
98
118
  copy_file(source, dest_dir, force)
99
119
 
120
+ # Check if it's a prompt template
121
+ elif name_lower in PROMPTS:
122
+ source = useful_prompts_dir / PROMPTS[name_lower]
123
+ dest_dir = Path(path) if path else current_dir / "prompts"
124
+ copy_directory(source, dest_dir, force)
125
+
100
126
  else:
101
127
  console.print(f"[red]Unknown: {name}[/red]")
102
128
  console.print("Use [cyan]co copy --list[/cyan] to see available items")
@@ -119,12 +145,31 @@ def copy_file(source: Path, dest_dir: Path, force: bool):
119
145
  console.print(f"[green]✓ Copied: {dest}[/green]")
120
146
 
121
147
 
148
+ def copy_directory(source: Path, dest_dir: Path, force: bool):
149
+ """Copy an entire directory to destination."""
150
+ if not source.exists():
151
+ console.print(f"[red]Source not found: {source}[/red]")
152
+ return
153
+
154
+ dest_dir.mkdir(parents=True, exist_ok=True)
155
+ dest = dest_dir / source.name
156
+
157
+ if dest.exists():
158
+ if not force:
159
+ console.print(f"[yellow]Skipped: {dest} (exists, use --force)[/yellow]")
160
+ return
161
+ shutil.rmtree(dest)
162
+
163
+ shutil.copytree(source, dest)
164
+ console.print(f"[green]✓ Copied: {dest}/[/green]")
165
+
166
+
122
167
  def show_available_items():
123
- """Display available tools, plugins, and TUI components."""
168
+ """Display available tools, plugins, prompts, and TUI components."""
124
169
  table = Table(title="Available Items to Copy")
125
170
  table.add_column("Name", style="cyan")
126
171
  table.add_column("Type", style="green")
127
- table.add_column("File")
172
+ table.add_column("Path")
128
173
 
129
174
  for name, file in sorted(TOOLS.items()):
130
175
  table.add_row(name, "tool", file)
@@ -132,8 +177,12 @@ def show_available_items():
132
177
  for name, file in sorted(PLUGINS.items()):
133
178
  table.add_row(name, "plugin", file)
134
179
 
180
+ for name, dir_name in sorted(PROMPTS.items()):
181
+ table.add_row(name, "prompt", f"{dir_name}/")
182
+
135
183
  for name, file in sorted(TUI.items()):
136
184
  table.add_row(name, "tui", file)
137
185
 
138
186
  console.print(table)
139
187
  console.print("\n[dim]Usage: co copy <name> [--path ./custom/][/dim]")
188
+ console.print("[dim]Prompts are copied as directories to ./prompts/<name>/[/dim]")
@@ -35,7 +35,8 @@ from .project_cmd_lib import (
35
35
  get_template_info,
36
36
  generate_custom_template_with_name,
37
37
  show_progress,
38
- configure_env_for_provider
38
+ configure_env_for_provider,
39
+ get_docs_source,
39
40
  )
40
41
 
41
42
  console = Console()
@@ -358,26 +359,28 @@ def handle_create(name: Optional[str], ai: Optional[bool], key: Optional[str],
358
359
  if not co_dir.exists():
359
360
  co_dir.mkdir(exist_ok=True)
360
361
 
361
- # Create docs directory
362
+ # Create docs directory and copy ALL documentation (always overwrite for latest version)
362
363
  docs_dir = co_dir / "docs"
364
+ if docs_dir.exists():
365
+ shutil.rmtree(docs_dir)
363
366
  docs_dir.mkdir(exist_ok=True)
364
367
 
365
- # Copy ConnectOnion documentation from single master source
366
- cli_dir = Path(__file__).parent.parent
368
+ # Get docs source (works in both dev and installed package)
369
+ docs_source = get_docs_source()
367
370
 
368
- # Copy the main vibe-coding documentation - keep original filename
369
- master_vibe_doc = cli_dir / "docs" / "co-vibecoding-principles-docs-contexts-all-in-one.md"
370
- if master_vibe_doc.exists():
371
- # Copy to .co/docs/ (project metadata)
372
- shutil.copy2(master_vibe_doc, docs_dir / "co-vibecoding-principles-docs-contexts-all-in-one.md")
373
- files_created.append(".co/docs/co-vibecoding-principles-docs-contexts-all-in-one.md")
374
-
375
- # ALSO copy to project root (always visible, easier to find)
376
- root_doc = project_dir / "co-vibecoding-principles-docs-contexts-all-in-one.md"
377
- shutil.copy2(master_vibe_doc, root_doc)
378
- files_created.append("co-vibecoding-principles-docs-contexts-all-in-one.md")
371
+ # Copy ALL docs to .co/docs/
372
+ if docs_source.exists() and docs_source.is_dir():
373
+ for item in docs_source.iterdir():
374
+ if item.name.startswith('.') or item.name == 'archive':
375
+ continue
376
+ dest = docs_dir / item.name
377
+ if item.is_dir():
378
+ shutil.copytree(item, dest, dirs_exist_ok=True)
379
+ else:
380
+ shutil.copy2(item, dest)
381
+ files_created.append(".co/docs/ (full documentation)")
379
382
  else:
380
- console.print(f"[yellow]⚠️ Warning: Vibe coding documentation not found at {master_vibe_doc}[/yellow]")
383
+ console.print(f"[yellow]⚠️ Warning: Documentation not found at {docs_source}[/yellow]")
381
384
 
382
385
  # Create config.toml (simplified - agent metadata now in .env)
383
386
  config = {
@@ -500,7 +503,7 @@ todo.md
500
503
 
501
504
  # Vibe Coding hint - clean formatting with proper spacing
502
505
  console.print("[bold yellow]💡 Vibe Coding:[/bold yellow] Use Claude/Cursor/Codex with")
503
- console.print(f" [cyan]co-vibecoding-principles-docs-contexts-all-in-one.md[/cyan]")
506
+ console.print(f" [cyan].co/docs/[/cyan] for full documentation")
504
507
  console.print()
505
508
 
506
509
  # Resources - clean format with arrows for better alignment
@@ -37,7 +37,8 @@ from .project_cmd_lib import (
37
37
  interactive_menu,
38
38
  generate_custom_template,
39
39
  show_progress,
40
- configure_env_for_provider
40
+ configure_env_for_provider,
41
+ get_docs_source,
41
42
  )
42
43
 
43
44
  console = Console()
@@ -332,30 +333,28 @@ def handle_init(ai: Optional[bool], key: Optional[str], template: Optional[str],
332
333
  co_dir = Path(current_dir) / ".co"
333
334
  co_dir.mkdir(exist_ok=True)
334
335
 
335
- # Create docs directory and copy documentation (always overwrite for latest version)
336
+ # Create docs directory and copy ALL documentation (always overwrite for latest version)
336
337
  docs_dir = co_dir / "docs"
337
338
  if docs_dir.exists():
338
339
  shutil.rmtree(docs_dir)
339
340
  docs_dir.mkdir(exist_ok=True)
340
341
 
341
- # Copy ConnectOnion documentation
342
- cli_dir = Path(__file__).parent.parent
343
-
344
- # Always copy the vibe coding doc for all templates - it's the master reference doc
345
- master_doc = cli_dir / "docs" / "co-vibecoding-principles-docs-contexts-all-in-one.md"
346
-
347
- if master_doc.exists():
348
- # Copy to .co/docs/ (project metadata)
349
- target_doc = docs_dir / "co-vibecoding-principles-docs-contexts-all-in-one.md"
350
- shutil.copy2(master_doc, target_doc)
351
- files_created.append(".co/docs/co-vibecoding-principles-docs-contexts-all-in-one.md")
342
+ # Get docs source (works in both dev and installed package)
343
+ docs_source = get_docs_source()
352
344
 
353
- # ALSO copy to project root (always visible, easier to find)
354
- root_doc = Path(current_dir) / "co-vibecoding-principles-docs-contexts-all-in-one.md"
355
- shutil.copy2(master_doc, root_doc)
356
- files_created.append("co-vibecoding-principles-docs-contexts-all-in-one.md")
345
+ # Copy ALL docs to .co/docs/
346
+ if docs_source.exists() and docs_source.is_dir():
347
+ for item in docs_source.iterdir():
348
+ if item.name.startswith('.') or item.name == 'archive':
349
+ continue
350
+ dest = docs_dir / item.name
351
+ if item.is_dir():
352
+ shutil.copytree(item, dest, dirs_exist_ok=True)
353
+ else:
354
+ shutil.copy2(item, dest)
355
+ files_created.append(".co/docs/ (full documentation)")
357
356
  else:
358
- console.print(f"[yellow]⚠️ Warning: Vibe coding documentation not found at {master_doc}[/yellow]")
357
+ console.print(f"[yellow]⚠️ Warning: Documentation not found at {docs_source}[/yellow]")
359
358
 
360
359
  # Use global identity instead of generating project keys
361
360
  # NO PROJECT KEYS - we use global address/email
@@ -402,7 +401,6 @@ def handle_init(ai: Optional[bool], key: Optional[str], template: Optional[str],
402
401
  .co/cache/
403
402
  .co/logs/
404
403
  .co/history/
405
- co-vibecoding-principles-docs-contexts-all-in-one.md
406
404
  *.py[cod]
407
405
  __pycache__/
408
406
  todo.md
@@ -437,12 +435,11 @@ todo.md
437
435
 
438
436
  # Vibe Coding hint - clean formatting with proper spacing
439
437
  console.print("[bold yellow]💡 Vibe Coding:[/bold yellow] Use Claude/Cursor/Codex with")
440
- console.print(f" [cyan]co-vibecoding-principles-docs-contexts-all-in-one.md[/cyan]")
438
+ console.print(f" [cyan].co/docs/[/cyan] for full documentation")
441
439
  else:
442
440
  # Vibe Coding hint for building from scratch
443
441
  console.print("[bold yellow]💡 Vibe Coding:[/bold yellow] Use Claude/Cursor/Codex with")
444
- console.print(f" [cyan]co-vibecoding-principles-docs-contexts-all-in-one.md[/cyan]")
445
- console.print(" to build your agent")
442
+ console.print(f" [cyan].co/docs/[/cyan] to build your agent")
446
443
 
447
444
  # Resources - clean format with arrows for better alignment
448
445
  console.print()
@@ -31,6 +31,20 @@ from ... import address
31
31
  console = Console()
32
32
 
33
33
 
34
+ def get_docs_source() -> Path:
35
+ """Get the docs directory path - works in both dev and installed package."""
36
+ # After pip install: connectonion/docs/ exists (via force-include)
37
+ package_dir = Path(__file__).parent.parent.parent # connectonion/cli/commands/ → connectonion/
38
+ docs_source = package_dir / "docs"
39
+
40
+ # Fallback for editable install: docs are at project root
41
+ if not docs_source.exists():
42
+ project_root = package_dir.parent
43
+ docs_source = project_root / "docs"
44
+
45
+ return docs_source
46
+
47
+
34
48
 
35
49
 
36
50
  def validate_project_name(name: str) -> Tuple[bool, str]:
@@ -822,6 +836,7 @@ __all__ = [
822
836
  'show_progress',
823
837
  'generate_custom_template',
824
838
  'generate_custom_template_with_name',
839
+ 'get_docs_source',
825
840
  ]
826
841
 
827
842
  # All the handle_init and handle_create code has been moved to init.py and create.py
connectonion/cli/main.py CHANGED
@@ -141,6 +141,17 @@ def browser(command: str = typer.Argument(..., help="Browser command")):
141
141
  handle_browser(command)
142
142
 
143
143
 
144
+ @app.command()
145
+ def ai(
146
+ port: int = typer.Option(8000, "--port", "-p", help="Port for web server"),
147
+ model: str = typer.Option("co/claude-opus-4-5", "--model", "-m", help="Model to use"),
148
+ max_iterations: int = typer.Option(20, "--max-iterations", "-i", help="Max iterations"),
149
+ ):
150
+ """Start AI coding agent web server."""
151
+ from .commands.ai_commands import handle_ai
152
+ handle_ai(port=port, model=model, max_iterations=max_iterations)
153
+
154
+
144
155
  @app.command()
145
156
  def copy(
146
157
  names: List[str] = typer.Argument(None, help="Tool or plugin names to copy"),