codeply-cli 0.5.1 → 0.5.3

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 (387) hide show
  1. package/LICENSE +21 -0
  2. package/THIRD_PARTY_NOTICES.md +65 -63
  3. package/bin/codeply.js +1 -1
  4. package/lib/agent.mjs +133 -24
  5. package/lib/ai.js +268 -9
  6. package/lib/ai.mjs +6 -6
  7. package/lib/apply-patch.js +217 -217
  8. package/lib/arity-table.json +138 -138
  9. package/lib/arity.js +70 -70
  10. package/lib/auth.mjs +6 -6
  11. package/lib/bots.js +82 -17
  12. package/lib/chatgpt.js +282 -0
  13. package/lib/cloud-browser.mjs +143 -143
  14. package/lib/cloud.mjs +1250 -1144
  15. package/lib/commands.js +103 -103
  16. package/lib/config.js +83 -3
  17. package/lib/design-library/assemble-artifact.mjs +21 -21
  18. package/lib/design-library/cleanup.mjs +45 -45
  19. package/lib/design-library/index.json +22379 -22379
  20. package/lib/design-library/make-table-data.mjs +39 -39
  21. package/lib/diagnostics.js +192 -192
  22. package/lib/edit-engine.js +364 -364
  23. package/lib/github-agent.mjs +311 -311
  24. package/lib/history.js +75 -75
  25. package/lib/mail-watch.js +504 -0
  26. package/lib/mcp.js +258 -258
  27. package/lib/model-sync.js +114 -0
  28. package/lib/native-tools.mjs +16 -1
  29. package/lib/oauth-connectors.js +146 -24
  30. package/lib/permissions.js +109 -109
  31. package/lib/plugins.js +353 -353
  32. package/lib/publish.js +916 -0
  33. package/lib/reach.js +67 -0
  34. package/lib/server.mjs +457 -457
  35. package/lib/session-db.js +220 -220
  36. package/lib/share.js +168 -168
  37. package/lib/skills.js +2 -0
  38. package/lib/snapshot.js +146 -146
  39. package/lib/telemetry.js +102 -0
  40. package/lib/terminal-hints.js +154 -154
  41. package/lib/tools.mjs +316 -14
  42. package/lib/typecheck-worker.js +147 -147
  43. package/lib/web-tools.js +209 -158
  44. package/package.json +49 -49
  45. package/skills/SOURCE.md +58 -58
  46. package/skills/accessibility/SKILL.md +147 -147
  47. package/skills/agent-architecture-audit/SKILL.md +257 -257
  48. package/skills/agent-eval/SKILL.md +147 -147
  49. package/skills/agent-harness-construction/SKILL.md +74 -74
  50. package/skills/agent-introspection-debugging/SKILL.md +154 -154
  51. package/skills/agent-payment-x402/SKILL.md +225 -225
  52. package/skills/agent-self-evaluation/SKILL.md +182 -182
  53. package/skills/agent-self-evaluation/references/evaluation-criteria.md +71 -71
  54. package/skills/agent-self-evaluation/references/hook-integration.md +64 -64
  55. package/skills/agent-sort/SKILL.md +216 -216
  56. package/skills/agentic-engineering/SKILL.md +64 -64
  57. package/skills/agentic-os/SKILL.md +388 -388
  58. package/skills/ai-first-engineering/SKILL.md +52 -52
  59. package/skills/ai-regression-testing/SKILL.md +386 -386
  60. package/skills/android-clean-architecture/SKILL.md +340 -340
  61. package/skills/angular-developer/SKILL.md +155 -155
  62. package/skills/angular-developer/references/angular-animations.md +160 -160
  63. package/skills/angular-developer/references/angular-aria.md +410 -410
  64. package/skills/angular-developer/references/cli.md +86 -86
  65. package/skills/angular-developer/references/component-harnesses.md +59 -59
  66. package/skills/angular-developer/references/component-styling.md +91 -91
  67. package/skills/angular-developer/references/components.md +117 -117
  68. package/skills/angular-developer/references/creating-services.md +97 -97
  69. package/skills/angular-developer/references/data-resolvers.md +69 -69
  70. package/skills/angular-developer/references/define-routes.md +67 -67
  71. package/skills/angular-developer/references/defining-providers.md +72 -72
  72. package/skills/angular-developer/references/di-fundamentals.md +120 -120
  73. package/skills/angular-developer/references/e2e-testing.md +56 -56
  74. package/skills/angular-developer/references/effects.md +83 -83
  75. package/skills/angular-developer/references/hierarchical-injectors.md +43 -43
  76. package/skills/angular-developer/references/host-elements.md +80 -80
  77. package/skills/angular-developer/references/injection-context.md +63 -63
  78. package/skills/angular-developer/references/inputs.md +101 -101
  79. package/skills/angular-developer/references/linked-signal.md +59 -59
  80. package/skills/angular-developer/references/loading-strategies.md +61 -61
  81. package/skills/angular-developer/references/mcp.md +108 -108
  82. package/skills/angular-developer/references/navigate-to-routes.md +69 -69
  83. package/skills/angular-developer/references/outputs.md +86 -86
  84. package/skills/angular-developer/references/reactive-forms.md +122 -122
  85. package/skills/angular-developer/references/rendering-strategies.md +44 -44
  86. package/skills/angular-developer/references/resource.md +77 -77
  87. package/skills/angular-developer/references/route-animations.md +56 -56
  88. package/skills/angular-developer/references/route-guards.md +52 -52
  89. package/skills/angular-developer/references/router-lifecycle.md +45 -45
  90. package/skills/angular-developer/references/router-testing.md +87 -87
  91. package/skills/angular-developer/references/show-routes-with-outlets.md +68 -68
  92. package/skills/angular-developer/references/signal-forms.md +795 -795
  93. package/skills/angular-developer/references/signals-overview.md +94 -94
  94. package/skills/angular-developer/references/tailwind-css.md +69 -69
  95. package/skills/angular-developer/references/template-driven-forms.md +114 -114
  96. package/skills/angular-developer/references/testing-fundamentals.md +65 -65
  97. package/skills/api-connector-builder/SKILL.md +121 -121
  98. package/skills/api-design/SKILL.md +524 -524
  99. package/skills/architecture-decision-records/SKILL.md +180 -180
  100. package/skills/article-writing/SKILL.md +80 -80
  101. package/skills/automation-audit-ops/SKILL.md +143 -143
  102. package/skills/autonomous-agent-harness/SKILL.md +274 -274
  103. package/skills/autonomous-loops/SKILL.md +611 -611
  104. package/skills/backend-patterns/SKILL.md +562 -562
  105. package/skills/benchmark/SKILL.md +95 -95
  106. package/skills/benchmark-methodology/SKILL.md +191 -191
  107. package/skills/benchmark-optimization-loop/SKILL.md +71 -71
  108. package/skills/blender-motion-state-inspection/SKILL.md +165 -165
  109. package/skills/blueprint/SKILL.md +106 -106
  110. package/skills/brand-discovery/SKILL.md +145 -145
  111. package/skills/brand-discovery/references/10_purpose-why.md +40 -40
  112. package/skills/brand-discovery/references/20_positioning.md +44 -44
  113. package/skills/brand-discovery/references/30_audience-niche.md +52 -52
  114. package/skills/brand-discovery/references/40_personality-archetype.md +57 -57
  115. package/skills/brand-discovery/references/50_voice-tone.md +59 -59
  116. package/skills/brand-discovery/references/60_narrative-story.md +50 -50
  117. package/skills/brand-discovery/references/70_founder-tension.md +49 -49
  118. package/skills/brand-discovery/references/90_SYNTHESIS.md +133 -133
  119. package/skills/brand-voice/SKILL.md +98 -98
  120. package/skills/brand-voice/references/voice-profile-schema.md +55 -55
  121. package/skills/browser-qa/SKILL.md +105 -105
  122. package/skills/bun-runtime/SKILL.md +85 -85
  123. package/skills/canary-watch/SKILL.md +108 -108
  124. package/skills/carrier-relationship-management/SKILL.md +212 -212
  125. package/skills/cisco-ios-patterns/SKILL.md +164 -164
  126. package/skills/ck/SKILL.md +148 -148
  127. package/skills/claude-devfleet/SKILL.md +112 -112
  128. package/skills/click-path-audit/SKILL.md +245 -245
  129. package/skills/clickhouse-io/SKILL.md +445 -445
  130. package/skills/code-tour/SKILL.md +254 -254
  131. package/skills/codebase-onboarding/SKILL.md +234 -234
  132. package/skills/codehealth-mcp/SKILL.md +167 -167
  133. package/skills/coding-standards/SKILL.md +551 -551
  134. package/skills/competitive-platform-analysis/SKILL.md +214 -214
  135. package/skills/competitive-report-structure/SKILL.md +162 -162
  136. package/skills/compose-multiplatform-patterns/SKILL.md +300 -300
  137. package/skills/config-gc/SKILL.md +120 -120
  138. package/skills/configure-ecc/SKILL.md +385 -385
  139. package/skills/connections-optimizer/SKILL.md +190 -190
  140. package/skills/content-engine/SKILL.md +132 -132
  141. package/skills/content-hash-cache-pattern/SKILL.md +162 -162
  142. package/skills/context-budget/SKILL.md +136 -136
  143. package/skills/continuous-agent-loop/SKILL.md +46 -46
  144. package/skills/continuous-learning/SKILL.md +132 -132
  145. package/skills/continuous-learning-v2/SKILL.md +361 -361
  146. package/skills/contract-first/SKILL.md +287 -287
  147. package/skills/cost-aware-llm-pipeline/SKILL.md +184 -184
  148. package/skills/cost-tracking/SKILL.md +97 -97
  149. package/skills/council/SKILL.md +204 -204
  150. package/skills/cpp-coding-standards/SKILL.md +724 -724
  151. package/skills/cpp-testing/SKILL.md +325 -325
  152. package/skills/crosspost/SKILL.md +112 -112
  153. package/skills/csharp-testing/SKILL.md +322 -322
  154. package/skills/customer-billing-ops/SKILL.md +141 -141
  155. package/skills/customs-trade-compliance/SKILL.md +263 -263
  156. package/skills/dart-flutter-patterns/SKILL.md +564 -564
  157. package/skills/dashboard-builder/SKILL.md +109 -109
  158. package/skills/data-scraper-agent/SKILL.md +765 -765
  159. package/skills/data-throughput-accelerator/SKILL.md +74 -74
  160. package/skills/database-migrations/SKILL.md +430 -430
  161. package/skills/deep-research/SKILL.md +160 -160
  162. package/skills/defi-amm-security/SKILL.md +167 -167
  163. package/skills/delivery-gate/SKILL.md +126 -126
  164. package/skills/deployment-patterns/SKILL.md +428 -428
  165. package/skills/design-system/SKILL.md +83 -83
  166. package/skills/django-celery/SKILL.md +458 -458
  167. package/skills/django-patterns/SKILL.md +735 -735
  168. package/skills/django-security/SKILL.md +644 -644
  169. package/skills/django-tdd/SKILL.md +730 -730
  170. package/skills/django-verification/SKILL.md +470 -470
  171. package/skills/dmux-workflows/SKILL.md +192 -192
  172. package/skills/docker-patterns/SKILL.md +365 -365
  173. package/skills/documentation-lookup/SKILL.md +91 -91
  174. package/skills/dotnet-patterns/SKILL.md +322 -322
  175. package/skills/dynamic-workflow-mode/SKILL.md +124 -124
  176. package/skills/e2e-testing/SKILL.md +327 -327
  177. package/skills/ecc-guide/SKILL.md +190 -190
  178. package/skills/ecc-recipes/SKILL.md +149 -149
  179. package/skills/ecc-tools-cost-audit/SKILL.md +161 -161
  180. package/skills/email-ops/SKILL.md +122 -122
  181. package/skills/energy-procurement/SKILL.md +228 -228
  182. package/skills/enterprise-agent-ops/SKILL.md +51 -51
  183. package/skills/error-handling/SKILL.md +377 -377
  184. package/skills/eval-harness/SKILL.md +271 -271
  185. package/skills/evm-token-decimals/SKILL.md +131 -131
  186. package/skills/exa-search/SKILL.md +108 -108
  187. package/skills/fal-ai-media/SKILL.md +289 -289
  188. package/skills/fastapi-patterns/SKILL.md +514 -514
  189. package/skills/finance-billing-ops/SKILL.md +128 -128
  190. package/skills/flox-environments/SKILL.md +497 -497
  191. package/skills/flutter-dart-code-review/SKILL.md +436 -436
  192. package/skills/foundation-models-on-device/SKILL.md +243 -243
  193. package/skills/frontend-a11y/SKILL.md +446 -446
  194. package/skills/frontend-design-direction/SKILL.md +93 -93
  195. package/skills/frontend-patterns/SKILL.md +657 -657
  196. package/skills/frontend-slides/SKILL.md +185 -185
  197. package/skills/fsharp-testing/SKILL.md +281 -281
  198. package/skills/gan-style-harness/SKILL.md +279 -279
  199. package/skills/gateguard/SKILL.md +133 -133
  200. package/skills/generating-python-installer/SKILL.md +820 -820
  201. package/skills/git-workflow/SKILL.md +716 -716
  202. package/skills/github-ops/SKILL.md +145 -145
  203. package/skills/golang-patterns/SKILL.md +676 -676
  204. package/skills/golang-testing/SKILL.md +721 -721
  205. package/skills/google-workspace-ops/SKILL.md +96 -96
  206. package/skills/growth-log/SKILL.md +128 -128
  207. package/skills/healthcare-cdss-patterns/SKILL.md +246 -246
  208. package/skills/healthcare-emr-patterns/SKILL.md +160 -160
  209. package/skills/healthcare-eval-harness/SKILL.md +208 -208
  210. package/skills/healthcare-phi-compliance/SKILL.md +146 -146
  211. package/skills/hermes-imports/SKILL.md +89 -89
  212. package/skills/hexagonal-architecture/SKILL.md +277 -277
  213. package/skills/hipaa-compliance/SKILL.md +79 -79
  214. package/skills/homelab-network-readiness/SKILL.md +170 -170
  215. package/skills/homelab-network-setup/SKILL.md +130 -130
  216. package/skills/homelab-pihole-dns/SKILL.md +275 -275
  217. package/skills/homelab-vlan-segmentation/SKILL.md +312 -312
  218. package/skills/homelab-wireguard-vpn/SKILL.md +306 -306
  219. package/skills/hookify-rules/SKILL.md +128 -128
  220. package/skills/inherit-legacy-style/SKILL.md +157 -157
  221. package/skills/intent-driven-development/SKILL.md +360 -360
  222. package/skills/inventory-demand-planning/SKILL.md +247 -247
  223. package/skills/investor-materials/SKILL.md +97 -97
  224. package/skills/investor-outreach/SKILL.md +92 -92
  225. package/skills/ios-icon-gen/SKILL.md +158 -158
  226. package/skills/iterative-retrieval/SKILL.md +212 -212
  227. package/skills/ito-basket-compare/SKILL.md +64 -64
  228. package/skills/ito-compute/SKILL.md +129 -129
  229. package/skills/ito-data-atlas-agent/SKILL.md +64 -64
  230. package/skills/ito-market-intelligence/SKILL.md +61 -61
  231. package/skills/ito-trade-planner/SKILL.md +68 -68
  232. package/skills/java-coding-standards/SKILL.md +384 -384
  233. package/skills/jira-integration/SKILL.md +303 -303
  234. package/skills/jpa-patterns/SKILL.md +152 -152
  235. package/skills/knowledge-ops/SKILL.md +155 -155
  236. package/skills/kotlin-coroutines-flows/SKILL.md +285 -285
  237. package/skills/kotlin-exposed-patterns/SKILL.md +720 -720
  238. package/skills/kotlin-ktor-patterns/SKILL.md +690 -690
  239. package/skills/kotlin-patterns/SKILL.md +712 -712
  240. package/skills/kotlin-testing/SKILL.md +825 -825
  241. package/skills/kubernetes-patterns/SKILL.md +756 -756
  242. package/skills/laravel-patterns/SKILL.md +416 -416
  243. package/skills/laravel-plugin-discovery/SKILL.md +230 -230
  244. package/skills/laravel-security/SKILL.md +948 -948
  245. package/skills/laravel-tdd/SKILL.md +675 -675
  246. package/skills/laravel-verification/SKILL.md +180 -180
  247. package/skills/latency-critical-systems/SKILL.md +75 -75
  248. package/skills/lead-intelligence/SKILL.md +322 -322
  249. package/skills/liquid-glass-design/SKILL.md +279 -279
  250. package/skills/llm-trading-agent-security/SKILL.md +147 -147
  251. package/skills/logistics-exception-management/SKILL.md +222 -222
  252. package/skills/loop-design-check/SKILL.md +143 -143
  253. package/skills/mailtrap-email-integration/SKILL.md +77 -77
  254. package/skills/make-interfaces-feel-better/SKILL.md +152 -152
  255. package/skills/manim-video/SKILL.md +90 -90
  256. package/skills/market-research/SKILL.md +76 -76
  257. package/skills/marketing-campaign/SKILL.md +114 -114
  258. package/skills/mcp-server-patterns/SKILL.md +70 -70
  259. package/skills/messages-ops/SKILL.md +105 -105
  260. package/skills/ml-adoption-playbook/SKILL.md +57 -57
  261. package/skills/mle-workflow/SKILL.md +348 -348
  262. package/skills/motion-advanced/SKILL.md +596 -596
  263. package/skills/motion-foundations/SKILL.md +299 -299
  264. package/skills/motion-patterns/SKILL.md +434 -434
  265. package/skills/motion-ui/SKILL.md +576 -576
  266. package/skills/mysql-patterns/SKILL.md +413 -413
  267. package/skills/nanoclaw-repl/SKILL.md +34 -34
  268. package/skills/nestjs-patterns/SKILL.md +231 -231
  269. package/skills/netmiko-ssh-automation/SKILL.md +174 -174
  270. package/skills/network-bgp-diagnostics/SKILL.md +168 -168
  271. package/skills/network-config-validation/SKILL.md +211 -211
  272. package/skills/network-interface-health/SKILL.md +153 -153
  273. package/skills/nextjs-turbopack/SKILL.md +58 -58
  274. package/skills/nodejs-keccak256/SKILL.md +103 -103
  275. package/skills/nutrient-document-processing/SKILL.md +168 -168
  276. package/skills/nuxt4-patterns/SKILL.md +101 -101
  277. package/skills/openclaw-persona-forge/SKILL.md +289 -289
  278. package/skills/openclaw-persona-forge/references/avatar-style.md +124 -124
  279. package/skills/openclaw-persona-forge/references/boundary-rules.md +53 -53
  280. package/skills/openclaw-persona-forge/references/error-handling.md +53 -53
  281. package/skills/openclaw-persona-forge/references/identity-tension.md +48 -48
  282. package/skills/openclaw-persona-forge/references/naming-system.md +39 -39
  283. package/skills/openclaw-persona-forge/references/output-template.md +166 -166
  284. package/skills/opensource-pipeline/SKILL.md +256 -256
  285. package/skills/orch-add-feature/SKILL.md +45 -45
  286. package/skills/orch-build-mvp/SKILL.md +49 -49
  287. package/skills/orch-change-feature/SKILL.md +43 -43
  288. package/skills/orch-fix-defect/SKILL.md +43 -43
  289. package/skills/orch-pipeline/SKILL.md +121 -121
  290. package/skills/orch-refine-code/SKILL.md +44 -44
  291. package/skills/parallel-execution-optimizer/SKILL.md +74 -74
  292. package/skills/perl-patterns/SKILL.md +505 -505
  293. package/skills/perl-security/SKILL.md +504 -504
  294. package/skills/perl-testing/SKILL.md +476 -476
  295. package/skills/plan-canvas/SKILL.md +153 -153
  296. package/skills/plan-orchestrate/SKILL.md +263 -263
  297. package/skills/plankton-code-quality/SKILL.md +237 -237
  298. package/skills/postgres-patterns/SKILL.md +148 -148
  299. package/skills/prediction-market-oracle-research/SKILL.md +64 -64
  300. package/skills/prediction-market-risk-review/SKILL.md +61 -61
  301. package/skills/premium-web-design/SKILL.md +154 -154
  302. package/skills/prisma-patterns/SKILL.md +401 -401
  303. package/skills/product-capability/SKILL.md +142 -142
  304. package/skills/product-lens/SKILL.md +93 -93
  305. package/skills/production-audit/SKILL.md +207 -207
  306. package/skills/production-scheduling/SKILL.md +238 -238
  307. package/skills/project-flow-ops/SKILL.md +112 -112
  308. package/skills/prompt-optimizer/SKILL.md +398 -398
  309. package/skills/publish-website/SKILL.md +76 -0
  310. package/skills/python-patterns/SKILL.md +751 -751
  311. package/skills/python-testing/SKILL.md +817 -817
  312. package/skills/pytorch-patterns/SKILL.md +397 -397
  313. package/skills/quality-nonconformance/SKILL.md +260 -260
  314. package/skills/quarkus-patterns/SKILL.md +723 -723
  315. package/skills/quarkus-security/SKILL.md +468 -468
  316. package/skills/quarkus-tdd/SKILL.md +812 -812
  317. package/skills/quarkus-verification/SKILL.md +480 -480
  318. package/skills/ralphinho-rfc-pipeline/SKILL.md +68 -68
  319. package/skills/react-native-patterns/SKILL.md +326 -326
  320. package/skills/react-patterns/SKILL.md +342 -342
  321. package/skills/react-performance/SKILL.md +575 -575
  322. package/skills/react-testing/SKILL.md +424 -424
  323. package/skills/recsys-pipeline-architect/SKILL.md +115 -115
  324. package/skills/recursive-decision-ledger/SKILL.md +81 -81
  325. package/skills/redis-patterns/SKILL.md +404 -404
  326. package/skills/regex-vs-llm-structured-text/SKILL.md +221 -221
  327. package/skills/remotion-video-creation/SKILL.md +43 -43
  328. package/skills/repo-scan/SKILL.md +79 -79
  329. package/skills/research-ops/SKILL.md +113 -113
  330. package/skills/returns-reverse-logistics/SKILL.md +240 -240
  331. package/skills/rules-distill/SKILL.md +265 -265
  332. package/skills/rust-patterns/SKILL.md +500 -500
  333. package/skills/rust-testing/SKILL.md +501 -501
  334. package/skills/safety-guard/SKILL.md +76 -76
  335. package/skills/santa-method/SKILL.md +307 -307
  336. package/skills/scientific-db-pubmed-database/SKILL.md +176 -176
  337. package/skills/scientific-db-uspto-database/SKILL.md +178 -178
  338. package/skills/scientific-pkg-gget/SKILL.md +167 -167
  339. package/skills/scientific-thinking-literature-review/SKILL.md +193 -193
  340. package/skills/scientific-thinking-scholar-evaluation/SKILL.md +161 -161
  341. package/skills/search-first/SKILL.md +183 -183
  342. package/skills/security-bounty-hunter/SKILL.md +100 -100
  343. package/skills/security-review/SKILL.md +504 -504
  344. package/skills/security-scan/SKILL.md +166 -166
  345. package/skills/seo/SKILL.md +155 -155
  346. package/skills/skill-comply/SKILL.md +59 -59
  347. package/skills/skill-scout/SKILL.md +141 -141
  348. package/skills/skill-stocktake/SKILL.md +195 -195
  349. package/skills/social-graph-ranker/SKILL.md +155 -155
  350. package/skills/social-publisher/SKILL.md +130 -130
  351. package/skills/springboot-patterns/SKILL.md +315 -315
  352. package/skills/springboot-security/SKILL.md +273 -273
  353. package/skills/springboot-tdd/SKILL.md +159 -159
  354. package/skills/springboot-verification/SKILL.md +232 -232
  355. package/skills/strategic-compact/SKILL.md +142 -142
  356. package/skills/swift-actor-persistence/SKILL.md +144 -144
  357. package/skills/swift-concurrency-6-2/SKILL.md +216 -216
  358. package/skills/swift-protocol-di-testing/SKILL.md +191 -191
  359. package/skills/swiftui-patterns/SKILL.md +259 -259
  360. package/skills/taste/SKILL.md +264 -264
  361. package/skills/taste/references/genre-taxonomy.md +87 -87
  362. package/skills/tdd-workflow/SKILL.md +583 -583
  363. package/skills/team-agent-orchestration/SKILL.md +111 -111
  364. package/skills/team-builder/SKILL.md +169 -169
  365. package/skills/terminal-ops/SKILL.md +110 -110
  366. package/skills/tinystruct-patterns/SKILL.md +279 -279
  367. package/skills/tinystruct-patterns/references/architecture.md +90 -90
  368. package/skills/tinystruct-patterns/references/data-handling.md +60 -60
  369. package/skills/tinystruct-patterns/references/database.md +99 -99
  370. package/skills/tinystruct-patterns/references/routing.md +64 -64
  371. package/skills/tinystruct-patterns/references/system-usage.md +97 -97
  372. package/skills/tinystruct-patterns/references/testing.md +72 -72
  373. package/skills/token-budget-advisor/SKILL.md +134 -134
  374. package/skills/ui-demo/SKILL.md +466 -466
  375. package/skills/ui-to-vue/SKILL.md +135 -135
  376. package/skills/uncloud/SKILL.md +344 -344
  377. package/skills/unified-memory/SKILL.md +170 -170
  378. package/skills/unified-notifications-ops/SKILL.md +188 -188
  379. package/skills/verification-loop/SKILL.md +129 -129
  380. package/skills/video-editing/SKILL.md +311 -311
  381. package/skills/videodb/SKILL.md +375 -375
  382. package/skills/visa-doc-translate/SKILL.md +117 -117
  383. package/skills/vite-patterns/SKILL.md +450 -450
  384. package/skills/vue-patterns/SKILL.md +471 -471
  385. package/skills/windows-desktop-e2e/SKILL.md +888 -888
  386. package/skills/workspace-surface-audit/SKILL.md +126 -126
  387. package/skills/x-api/SKILL.md +235 -235
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Awais Siddique (Codeply)
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -1,63 +1,65 @@
1
- # Third-party notices
2
-
3
- Parts of the Codeply engine (codeply-cli/lib) are adapted from the open-source projects below. Each adapted section is marked in the source with a comment naming the project.
4
-
5
- ## opencode
6
-
7
- https://github.com/sst/opencode
8
-
9
- Used in: `lib/edit-engine.js` (fallback edit matchers), `lib/agent.mjs` (compaction summary template, instruction-file lookup order), `lib/snapshot.js` (hidden git snapshots for undo), `lib/arity.js` and `lib/arity-table.json` (command-name table for scoped approvals, copied from `permission/arity.ts`), `lib/ai.js` (retry-after handling), `lib/permissions.js` (rule evaluation approach), `lib/commands.js` (command file layout).
10
-
11
- ```
12
- MIT License
13
-
14
- Copyright (c) 2025 opencode
15
-
16
- Permission is hereby granted, free of charge, to any person obtaining a copy
17
- of this software and associated documentation files (the "Software"), to deal
18
- in the Software without restriction, including without limitation the rights
19
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
20
- copies of the Software, and to permit persons to whom the Software is
21
- furnished to do so, subject to the following conditions:
22
-
23
- The above copyright notice and this permission notice shall be included in all
24
- copies or substantial portions of the Software.
25
-
26
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
27
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
28
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
29
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
30
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
31
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
32
- SOFTWARE.
33
- ```
34
-
35
- ## Hermes Agent
36
-
37
- https://github.com/NousResearch/hermes-agent
38
-
39
- Used in: `lib/terminal-hints.js` (failed-command hints, masked-success check), `lib/agent.mjs` (stall nudges, loop and failure-streak guards, fallback summary), `lib/tools.mjs` (task list design).
40
-
41
- ```
42
- MIT License
43
-
44
- Copyright (c) 2025 Nous Research
45
-
46
- Permission is hereby granted, free of charge, to any person obtaining a copy
47
- of this software and associated documentation files (the "Software"), to deal
48
- in the Software without restriction, including without limitation the rights
49
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
50
- copies of the Software, and to permit persons to whom the Software is
51
- furnished to do so, subject to the following conditions:
52
-
53
- The above copyright notice and this permission notice shall be included in all
54
- copies or substantial portions of the Software.
55
-
56
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
57
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
58
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
59
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
60
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
61
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
62
- SOFTWARE.
63
- ```
1
+ # Third-party notices
2
+
3
+ "OpenAI", "ChatGPT" and the OpenAI Blossom logo (`assets/brand/openai-blossom-*.svg` in the desktop app, shown next to "Continue with ChatGPT") are trademarks of OpenAI, used unmodified under OpenAI's brand guidelines (https://openai.com/brand). They are not covered by this project's MIT license, and their use does not imply endorsement by OpenAI.
4
+
5
+ Parts of the Codeply engine (codeply-cli/lib) are adapted from the open-source projects below. Each adapted section is marked in the source with a comment naming the project.
6
+
7
+ ## opencode
8
+
9
+ https://github.com/sst/opencode
10
+
11
+ Used in: `lib/edit-engine.js` (fallback edit matchers), `lib/agent.mjs` (compaction summary template, instruction-file lookup order), `lib/snapshot.js` (hidden git snapshots for undo), `lib/arity.js` and `lib/arity-table.json` (command-name table for scoped approvals, copied from `permission/arity.ts`), `lib/ai.js` (retry-after handling), `lib/permissions.js` (rule evaluation approach), `lib/commands.js` (command file layout).
12
+
13
+ ```
14
+ MIT License
15
+
16
+ Copyright (c) 2025 opencode
17
+
18
+ Permission is hereby granted, free of charge, to any person obtaining a copy
19
+ of this software and associated documentation files (the "Software"), to deal
20
+ in the Software without restriction, including without limitation the rights
21
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
22
+ copies of the Software, and to permit persons to whom the Software is
23
+ furnished to do so, subject to the following conditions:
24
+
25
+ The above copyright notice and this permission notice shall be included in all
26
+ copies or substantial portions of the Software.
27
+
28
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
29
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
30
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
31
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
32
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
33
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
34
+ SOFTWARE.
35
+ ```
36
+
37
+ ## Hermes Agent
38
+
39
+ https://github.com/NousResearch/hermes-agent
40
+
41
+ Used in: `lib/terminal-hints.js` (failed-command hints, masked-success check), `lib/agent.mjs` (stall nudges, loop and failure-streak guards, fallback summary), `lib/tools.mjs` (task list design).
42
+
43
+ ```
44
+ MIT License
45
+
46
+ Copyright (c) 2025 Nous Research
47
+
48
+ Permission is hereby granted, free of charge, to any person obtaining a copy
49
+ of this software and associated documentation files (the "Software"), to deal
50
+ in the Software without restriction, including without limitation the rights
51
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
52
+ copies of the Software, and to permit persons to whom the Software is
53
+ furnished to do so, subject to the following conditions:
54
+
55
+ The above copyright notice and this permission notice shall be included in all
56
+ copies or substantial portions of the Software.
57
+
58
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
59
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
60
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
61
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
62
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
63
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
64
+ SOFTWARE.
65
+ ```
package/bin/codeply.js CHANGED
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env node
1
+ #!/usr/bin/env node
2
2
  /**
3
3
  * Codeply CLI - apply an AI instruction to a file from the terminal.
4
4
  *
package/lib/agent.mjs CHANGED
@@ -24,11 +24,12 @@ const mcpLib = require('./mcp.js');
24
24
  const skills = require('./skills.js');
25
25
  const plugins = require('./plugins.js');
26
26
  const rolesLib = require('./subagents.js');
27
+ const reachLib = require('./reach.js');
27
28
  const config = require('./config.js');
28
29
 
29
30
  // Enough room for a real task plus its verification pass. /goal runs pass a
30
31
  // larger budget per iteration (see main.js).
31
- const MAX_STEPS = 40;
32
+ const MAX_STEPS = 80;
32
33
  const MAX_MALFORMED_RETRIES = 3;
33
34
  // How much transcript (system prompt included) is sent per step before older
34
35
  // tool results get collapsed. The hosted proxy is a Supabase Edge Function
@@ -51,9 +52,10 @@ const FORMAT_CORRECTION =
51
52
  'closing tags complete:\n\n' +
52
53
  '<codeply:read_file>\n<path>run.html</path>\n</codeply:read_file>\n\n' +
53
54
  'Valid names: todo, ask_user, mcp, list_dir, read_file, write_file, edit_file, search, run, use_skill, list_skills, fetch_image, ' +
54
- 'browser_check, gmail_send, gmail_search, slack_post_message, vercel_deploy, supabase_create_project, ' +
55
+ 'browser_check, gmail_send, gmail_search, gmail_draft, drafts_list, calendar_list, calendar_add, slack_post_message, vercel_deploy, supabase_create_project, ' +
55
56
  'supabase_delete_project, github_create_repo, design_reference_search, view_images, supabase_api, supabase_sql, vercel_api, ' +
56
- 'web_fetch, web_search, apply_patch, plan_exit, plan_enter, lsp.';
57
+ 'web_fetch, web_search, image_search, reach_me, watch_email, apply_patch, plan_exit, plan_enter, lsp, publish_check, publish_connect, supabase_setup, supabase_schema, ' +
58
+ 'publish_deploy, publish_github.';
57
59
 
58
60
  const TRUNCATION_CORRECTION =
59
61
  '[system] That reply got cut off partway through the action block - the tag syntax was fine, it simply ran out of ' +
@@ -144,7 +146,7 @@ const CLAIM_SHIPPED = new RegExp(
144
146
  `|\\b(?:is|are)\\s+now\\s+live\\s+(?:at|on)\\b`,
145
147
  'i',
146
148
  );
147
- const SHIP_TOOLS = new Set(['run', 'vercel_deploy', 'vercel_api', 'github_create_repo', 'supabase_api']);
149
+ const SHIP_TOOLS = new Set(['run', 'vercel_deploy', 'vercel_api', 'github_create_repo', 'supabase_api', 'publish_deploy', 'publish_github']);
148
150
 
149
151
  const unbackedClaimCorrection = (what) =>
150
152
  `[system] Your last reply says you ${what}, but no tool that could have done that ran successfully this turn. ` +
@@ -178,7 +180,7 @@ const MAX_HALLUCINATION_RETRIES = 3;
178
180
  const MAX_VERIFY_NUDGES = 2;
179
181
 
180
182
  // Look-around blocks that may share one reply (see the loop).
181
- const BATCHABLE_TOOLS = new Set(['read_file', 'list_dir', 'search', 'web_fetch', 'web_search', 'lsp']);
183
+ const BATCHABLE_TOOLS = new Set(['read_file', 'list_dir', 'search', 'web_fetch', 'web_search', 'image_search', 'lsp']);
182
184
  const MAX_BATCH = 4;
183
185
 
184
186
  // Identical call, identical arguments, this many times in a row = stuck.
@@ -251,12 +253,13 @@ const cycleNote = (period) =>
251
253
  // instead of being cut off mid-edit. Idea from Hermes Agent / opencode.
252
254
  const budgetCheckpointNote = (used, max) =>
253
255
  `[system] You have used ${used} of ${max} steps for this turn. Finish the change you are in the middle of, check it, ` +
254
- 'and wrap up with your summary. If the whole task cannot fit, get the current part to a working state and list what is left.';
256
+ 'and wrap up with a short summary. If the whole task cannot fit, get the current part to a working state and name what is left in a line or two.';
255
257
 
256
258
  const FINAL_SUMMARY_PROMPT =
257
259
  '[system] The step budget for this turn is used up, so actions are switched off: do not write any action block, it ' +
258
- 'would be ignored. Reply with a short summary for the user: what you actually changed (only files a tool result ' +
259
- 'confirms), what you checked and the result, and what is left to do. Do not claim anything the tool results do not show.';
260
+ 'would be ignored. Reply with a short note for the user: one sentence on where things stand, then at most 4 short ' +
261
+ 'bullets on what you changed (only files a tool result confirms) and what is left. No headings, IDs or evidence ' +
262
+ 'lists, and do not mention the step budget. Under about 100 words. Do not claim anything the tool results do not show.';
260
263
 
261
264
  // ─── Protocol ───────────────────────────────────────────────────────────────
262
265
 
@@ -264,7 +267,7 @@ const TOOL_TAG = /<codeply:([a-z_]+)>([\s\S]*?)<\/codeply:\1>/g;
264
267
 
265
268
  // Params whose value is a raw payload (file content, code blocks) and may
266
269
  // legitimately contain angle-bracket tags of its own.
267
- const CONTAINER_PARAMS = new Set(['content', 'search', 'replace', 'body', 'text', 'patch']);
270
+ const CONTAINER_PARAMS = new Set(['content', 'search', 'replace', 'body', 'text', 'patch', 'sql']);
268
271
 
269
272
  /** Tag payloads are written on their own lines; drop only that framing. */
270
273
  function trimFraming(value) {
@@ -320,8 +323,12 @@ const PARAMS = {
320
323
  list_skills: ['query'],
321
324
  fetch_image: ['url', 'path'],
322
325
  browser_check: ['url', 'wait', 'viewport'],
323
- gmail_send: ['to', 'subject', 'body'],
326
+ gmail_send: ['to', 'subject', 'body', 'draft'],
324
327
  gmail_search: ['query'],
328
+ gmail_draft: ['to', 'subject', 'body'],
329
+ drafts_list: [],
330
+ calendar_list: ['from', 'to', 'max'],
331
+ calendar_add: ['title', 'start', 'end', 'description', 'location', 'reminders'],
325
332
  slack_post_message: ['channel', 'text'],
326
333
  vercel_deploy: ['path'],
327
334
  supabase_create_project: ['name'],
@@ -332,8 +339,17 @@ const PARAMS = {
332
339
  supabase_api: ['method', 'path', 'body'],
333
340
  supabase_sql: ['ref', 'query'],
334
341
  vercel_api: ['method', 'path', 'body'],
342
+ publish_check: ['path'],
343
+ publish_connect: ['service', 'reason'],
344
+ supabase_setup: ['project', 'name', 'region'],
345
+ supabase_schema: ['ref', 'sql', 'path'],
346
+ publish_deploy: ['path', 'name'],
347
+ publish_github: ['path', 'name', 'private'],
335
348
  web_fetch: ['url', 'format'],
336
349
  web_search: ['query', 'num'],
350
+ image_search: ['query', 'num'],
351
+ reach_me: ['how', 'message', 'at', 'bot'], // only when the host can reach the phone (lib/reach.js)
352
+ watch_email: ['from', 'how', 'note', 'repeat'],
337
353
  apply_patch: ['patch'],
338
354
  plan_exit: ['path'],
339
355
  plan_enter: ['reason'],
@@ -365,9 +381,19 @@ const NAME_ALIASES = {
365
381
  previewcheck: 'browser_check', browserpreview: 'browser_check', check: 'browser_check',
366
382
  gmail_send: 'gmail_send', gmailsend: 'gmail_send', sendemail: 'gmail_send', email: 'gmail_send', sendmail: 'gmail_send',
367
383
  gmail_search: 'gmail_search', gmailsearch: 'gmail_search', searchemail: 'gmail_search', searchgmail: 'gmail_search',
384
+ gmail_draft: 'gmail_draft', gmaildraft: 'gmail_draft', draftemail: 'gmail_draft', savedraft: 'gmail_draft', createdraft: 'gmail_draft',
385
+ drafts_list: 'drafts_list', draftslist: 'drafts_list', listdrafts: 'drafts_list', drafts: 'drafts_list',
386
+ calendar_list: 'calendar_list', calendarlist: 'calendar_list', listevents: 'calendar_list', calendar: 'calendar_list', events: 'calendar_list', getevents: 'calendar_list',
387
+ calendar_add: 'calendar_add', calendaradd: 'calendar_add', addevent: 'calendar_add', createevent: 'calendar_add', addtocalendar: 'calendar_add', newevent: 'calendar_add',
368
388
  slack_post_message: 'slack_post_message', slackpostmessage: 'slack_post_message',
369
389
  slackmessage: 'slack_post_message', slackpost: 'slack_post_message', postmessage: 'slack_post_message',
370
- vercel_deploy: 'vercel_deploy', vercel: 'vercel_deploy', deploy: 'vercel_deploy', publish: 'vercel_deploy', vercelpublish: 'vercel_deploy',
390
+ vercel_deploy: 'vercel_deploy', vercel: 'vercel_deploy', vercelpublish: 'vercel_deploy',
391
+ publish_deploy: 'publish_deploy', publishdeploy: 'publish_deploy', deploy: 'publish_deploy', publish: 'publish_deploy',
392
+ publish_check: 'publish_check', publishcheck: 'publish_check',
393
+ publish_connect: 'publish_connect', publishconnect: 'publish_connect', connect: 'publish_connect',
394
+ supabase_setup: 'supabase_setup', supabasesetup: 'supabase_setup', setupdatabase: 'supabase_setup',
395
+ supabase_schema: 'supabase_schema', supabaseschema: 'supabase_schema', applyschema: 'supabase_schema',
396
+ publish_github: 'publish_github', publishgithub: 'publish_github',
371
397
  supabase_create_project: 'supabase_create_project', supabase: 'supabase_create_project', createproject: 'supabase_create_project',
372
398
  createdatabase: 'supabase_create_project', makedatabase: 'supabase_create_project', create_database: 'supabase_create_project',
373
399
  supabase_delete_project: 'supabase_delete_project', deletesupabaseproject: 'supabase_delete_project',
@@ -383,6 +409,9 @@ const NAME_ALIASES = {
383
409
  supabase_sql: 'supabase_sql', supabasesql: 'supabase_sql', sql: 'supabase_sql', runsql: 'supabase_sql',
384
410
  vercel_api: 'vercel_api', vercelapi: 'vercel_api',
385
411
  web_fetch: 'web_fetch', webfetch: 'web_fetch', fetchurl: 'web_fetch', fetch_url: 'web_fetch', fetchpage: 'web_fetch', openurl: 'web_fetch', readurl: 'web_fetch',
412
+ reach_me: 'reach_me', reachme: 'reach_me', call_me: 'reach_me', callme: 'reach_me', text_me: 'reach_me', textme: 'reach_me', notify_me: 'reach_me', notifyme: 'reach_me', call_user: 'reach_me',
413
+ watch_email: 'watch_email', watchemail: 'watch_email', email_alert: 'watch_email', alert_on_email: 'watch_email', watch_inbox: 'watch_email',
414
+ image_search: 'image_search', imagesearch: 'image_search', searchimages: 'image_search', search_images: 'image_search', googleimages: 'image_search',
386
415
  web_search: 'web_search', websearch: 'web_search', searchweb: 'web_search', search_web: 'web_search', googlesearch: 'web_search',
387
416
  apply_patch: 'apply_patch', applypatch: 'apply_patch', patch: 'apply_patch',
388
417
  plan_exit: 'plan_exit', planexit: 'plan_exit', exitplan: 'plan_exit', exit_plan: 'plan_exit',
@@ -441,7 +470,8 @@ function recoverCall(text) {
441
470
  else if (has('items')) name = 'todo';
442
471
  else if (has('question') && has('options')) name = 'ask_user';
443
472
  else if (has('server') && has('tool')) name = 'mcp';
444
- else if (has('to') && has('subject')) name = 'gmail_send';
473
+ else if (has('to') && has('subject')) name = /<\/?\s*(?:codeply[:_-])?gmail_?draft/i.test(text) ? 'gmail_draft' : 'gmail_send';
474
+ else if (has('title') && has('start')) name = 'calendar_add';
445
475
  else if (has('channel') && has('text')) name = 'slack_post_message';
446
476
  else {
447
477
  const m = text.match(LOOSE_NAME_TAG);
@@ -781,8 +811,12 @@ match exactly one place.)
781
811
  <query>testing</query>
782
812
  </codeply:list_skills>
783
813
 
814
+ <codeply:image_search>
815
+ <query>matcha tea ceremony</query>
816
+ </codeply:image_search>
817
+
784
818
  <codeply:fetch_image>
785
- <url>https://loremflickr.com/1600/900/tea,leaves</url>
819
+ <url>(an image URL from image_search)</url>
786
820
  <path>assets/hero.jpg</path>
787
821
  </codeply:fetch_image>
788
822
 
@@ -803,6 +837,39 @@ The email body, plain text.
803
837
  <query>from:someone@example.com is:unread</query>
804
838
  </codeply:gmail_search>
805
839
 
840
+ <codeply:gmail_draft>
841
+ <to>someone@example.com</to>
842
+ <subject>Subject line</subject>
843
+ <body>
844
+ The email body, plain text.
845
+ </body>
846
+ </codeply:gmail_draft>
847
+
848
+ (gmail_draft saves a draft and sends nothing: in Gmail's Drafts when Gmail is
849
+ connected, otherwise in Codeply's own drafts. drafts_list lists Codeply's
850
+ drafts; gmail_send with <draft>id</draft> sends one of them.)
851
+
852
+ <codeply:drafts_list>
853
+ </codeply:drafts_list>
854
+
855
+ <codeply:calendar_list>
856
+ <from>today</from>
857
+ <to>2026-10-05</to>
858
+ </codeply:calendar_list>
859
+
860
+ <codeply:calendar_add>
861
+ <title>Dentist</title>
862
+ <start>2026-10-06T15:30</start>
863
+ <end>2026-10-06T16:15</end>
864
+ <location>Main St clinic</location>
865
+ <reminders>30</reminders>
866
+ </codeply:calendar_add>
867
+
868
+ (Calendar times are the user's local time: 2026-10-06T15:30 for a time,
869
+ 2026-10-06 for a whole day; from/to also take today or tomorrow. calendar_list
870
+ defaults to today. calendar_add puts a real event on the user's Google
871
+ Calendar and asks first; reminders is minutes before, comma-separated.)
872
+
806
873
  <codeply:slack_post_message>
807
874
  <channel>general</channel>
808
875
  <text>
@@ -844,6 +911,38 @@ create table if not exists todos (id bigint generated always as identity primary
844
911
  <path>/v9/projects</path>
845
912
  </codeply:vercel_api>
846
913
 
914
+ <codeply:publish_check>
915
+ </codeply:publish_check>
916
+
917
+ <codeply:publish_connect>
918
+ <service>supabase</service>
919
+ <reason>The app has sign-up and saves notes, so it needs a database.</reason>
920
+ </codeply:publish_connect>
921
+
922
+ <codeply:supabase_setup>
923
+ </codeply:supabase_setup>
924
+
925
+ <codeply:supabase_schema>
926
+ <sql>
927
+ create table if not exists notes (id bigint generated always as identity primary key, user_id uuid references auth.users not null default auth.uid(), body text not null);
928
+ create policy "own notes" on notes for all using (auth.uid() = user_id) with check (auth.uid() = user_id);
929
+ </sql>
930
+ </codeply:supabase_schema>
931
+
932
+ <codeply:publish_github>
933
+ </codeply:publish_github>
934
+
935
+ <codeply:publish_deploy>
936
+ </codeply:publish_deploy>
937
+
938
+ (Publishing, only when the user asked to publish/deploy/put it live: use_skill
939
+ publish-website first and follow it. publish_check reads the project;
940
+ publish_connect pauses until the user connects a service in one click;
941
+ supabase_setup picks or creates the Supabase project and writes its URL and anon
942
+ key into the app; supabase_schema runs SQL after the user approves it, with RLS;
943
+ publish_deploy asks about GitHub once, then deploys to Vercel and waits until it
944
+ is live; publish_github creates or reuses the repo, pushes and links Vercel.)
945
+
847
946
  <codeply:design_reference_search>
848
947
  <term>to-do list</term>
849
948
  <category>productivity</category>
@@ -931,19 +1030,21 @@ RULES
931
1030
  If an edit_file fails, its error shows the closest matching lines with numbers:
932
1031
  copy from those instead of re-reading the whole file.
933
1032
  - Before an action block write at most one short sentence (or nothing). Don't narrate plans, apologize, or restate what you just did; the user sees every action anyway. Save the explanation for your final answer.
1033
+ - Your final answer is a short note to a busy person, not a report. Open with the outcome in one plain sentence, then at most 3 to 5 short bullets: what changed, and anything that failed or is still left (one line each). No section headings like "What I changed" or "What I verified", no project refs, IDs, hashes, raw JSON, test account names or step-budget talk. Mention checks in a few words ("sign-in tested, works"), not as evidence lists. If work is left, end with one sentence offering the next step. Stay under about 120 words unless the user asked for detail.
934
1034
  - Keep "search" as narrow as the change actually is. When removing something, search should span exactly the thing being removed - not "from here to the end of the file" just because that was easy to copy. A wider span deletes whatever sits between your intended target and wherever you stopped, silently, even when it renders fine and reports no errors. If two things need removing and something unrelated sits between them, that is two edit_file calls, not one wide one.
935
1035
  - edit_file for changes to an existing file. write_file only for new files or a genuine full rewrite.
936
1036
  - Prefer run for anything you can check mechanically.
937
1037
  - run executes a real shell command on the user's own machine, in their own project directory, with their own git/gh credentials already configured - the exact same terminal they'd get typing it themselves. That includes git add, git commit, git push, gh pr create, npm install, or anything else. Never tell the user you don't have terminal or network access, or that you can't run a command - if it's a shell command, write a <codeply:run> action block and run it for real. Do not just describe what the command would do.
938
1038
  - If a task needs a CLI that turns out not to be installed, install it yourself with the platform's own package manager (winget on Windows, brew on macOS, apt/apt-get on Linux) via run before falling back to a manual workaround - do not immediately hand the user a "go do this in a browser" set of steps just because a binary is missing; installing it is itself a shell command. The one thing you genuinely cannot do unattended is an interactive auth step a CLI requires after installing (e.g. gh auth login opening a browser for a device code) - if the install succeeds but the tool then reports it isn't authenticated, that specific login step is the only part to ask the user for, not the whole task.
1039
+ - PUBLISHING: never publish, deploy or create cloud resources unless the user asked for that in so many words (publish, deploy, put it live, ship it, host it). Building or fixing a site is not a request to publish it. When they do ask, use_skill 'publish-website' first and follow it: publish_check, decide yourself whether the app needs a database, publish_connect for any service that is not connected (it waits for the user, then you carry on without asking again), supabase_setup and supabase_schema when a database is needed, then publish_deploy (and publish_github when the user wants GitHub). Finish with the live URL from the publish_deploy result, never one you built yourself. Prefer these over vercel_deploy and supabase_create_project.
939
1040
  - Deploying to Vercel, creating a Supabase project, or creating a new GitHub repo and pushing to it are NOT CLI tasks here - do not install or shell out to the vercel CLI, the supabase CLI, or gh repo create for these. Use vercel_deploy, supabase_create_project, and github_create_repo instead: they call the connected account directly (once the user has connected it from Connect Apps), with no separate CLI login step and no "go create an empty repo on github.com first." If one reports its integration isn't connected, say so plainly and point the user to Connect Apps (account menu) - do not fall back to the CLI/manual route as a workaround, and do not install the vercel/supabase CLI to route around a missing connection.
940
1041
  - FULL SUPABASE ACCESS: when Supabase is connected (see CONNECTED SERVICES), supabase_api reaches the entire Supabase Management API (https://api.supabase.com, paths start with /v1/) - list projects (GET /v1/projects), read API keys (GET /v1/projects/{ref}/api-keys?reveal=true), manage auth config, storage buckets, edge functions, secrets, branches, and more. supabase_sql runs SQL directly against a project's Postgres database - create and alter tables, write RLS policies, seed data, inspect schemas (select from information_schema). Always look up the real project ref first (GET /v1/projects) instead of guessing it. Read requests run immediately; changes ask the user first. Enable RLS and add policies on any table that holds user data.
941
1042
  - FULL VERCEL ACCESS: when Vercel is connected, vercel_api reaches the entire Vercel REST API (https://api.vercel.com, paths start with a version like /v9/) - projects (GET /v9/projects), deployments and their status/logs (GET /v6/deployments, GET /v13/deployments/{id}, GET /v3/deployments/{id}/events), env vars (/v10/projects/{id}/env), domains (/v10/projects/{id}/domains). The team id is added for you. Use vercel_deploy to ship a folder, then vercel_api to confirm the deployment reached READY and to read its build logs if it failed - do not report a deployment as live until you've seen it succeed.
942
1043
  - Tool results are the only source of truth about what happened. A failed result (non-2xx status, non-zero exit code, "did not apply") means it did not happen - never describe it as done.
943
1044
  - Creating a remote repo, pushing code, enabling Pages, or deploying anything are exactly the kind of claim covered by "never report success you did not verify" above - and the easiest one to get wrong, because each step's own command can silently no-op or partially fail while a LATER step still appears to succeed. Concretely: run whoami equivalents (gh api user, gh auth status) to get the real signed-in username BEFORE building any URL with it - never guess a username from the OS account name, the folder name, or anything the user said earlier that could be stale; after gh repo create or git push, treat the command's own exit code and printed output as the only source of truth for whether it worked, not your prior turn's summary of what you intended to do - a command you ran two turns ago having succeeded is not evidence this turn's retry did too; and never hand the user a repository/deployment URL you have not just confirmed resolves (curl -I it, or read it back from the command's own output) - a plausible-looking URL built from a guessed username/slug is a fabrication even if the pattern is usually right.
944
- - gmail_send and slack_post_message send a real email or a real Slack message the moment they run - there is no draft state, no "preview" mode. Only use them when the user actually asked for that email/message to go out, never speculatively, never as a way to "show" them what it would say. If gmail_search or a prior message makes clear Gmail/Slack isn't connected, say so plainly and stop - do not retry hoping it connects itself, and do not claim you sent something when the tool reported it wasn't connected.
1045
+ - gmail_send and slack_post_message send a real email or a real Slack message the moment they run - there is no "preview" mode. Only use them when the user actually asked for that email/message to go out, never speculatively, never as a way to "show" them what it would say. When the user wants an email written but not sent yet, use gmail_draft instead. The user sees the email on an editable card before it goes out and may change it: the tool result says what was really sent or saved, so report that, not your original wording. calendar_add likewise puts a real event on the user's Google Calendar: only when they asked for it, with times in their local time; check calendar_list first when they ask what is on their calendar or whether a time is free. If gmail_search or a prior message makes clear Gmail/Slack isn't connected, say so plainly and stop - do not retry hoping it connects itself, and do not claim you sent something when the tool reported it wasn't connected.
945
1046
  - vercel_deploy, supabase_create_project, supabase_delete_project, and github_create_repo are the same category as gmail_send/slack_post_message above: real, immediate action the moment they run - a live production deployment, a newly provisioned cloud database with its own bill, a brand-new repository pushed with the user's code. Only use them when the user actually asked for that outcome, never speculatively "to check if it would work." If one reports its integration isn't connected, say so plainly and stop rather than retrying or working around it. supabase_delete_project is the sharpest of these - it permanently destroys a database with no undo - so only reach for it when the user has clearly asked to delete or remove a specific project, never as cleanup for something that merely looks unused.
946
- - Every image in generated markup must be a local file, downloaded with fetch_image. NEVER write an <img> or CSS background-image pointing straight at loremflickr.com, picsum.photos, or any other live generator URL - those are redirect services that return a DIFFERENT random photo on every single request, so the page shows a different (sometimes completely unrelated) image on every reload, every redeploy, every visitor. Always fetch_image the URL to a real path under assets/ first, then reference that local path in the markup. If the user hasn't given you specific photos and the site needs placeholder imagery, fetch_image from https://loremflickr.com/<width>/<height>/<keyword1>,<keyword2> - it pulls a real tagged photo matching those keywords, no API key needed. Pick keywords that actually describe THAT section's subject (a tea shop's hero: 'tea,leaves' or 'matcha,ceremony', not generic filler) - never use a source that returns fully random, unrelated stock photos (e.g. picsum.photos) on a themed site; a beach or a crowd photo under a tea brand's "Our Heritage" section is worse than no image. If a downloaded placeholder turns out to be a broken/static-noise "no match" image or is visibly unrelated to its section once you look at the page, delete it and fetch_image again with more specific keywords - do not leave a wrong or corrupted image in place.
1047
+ - Images: build without photos first. Most pages look great with type, color, layout, CSS shapes, icons and inline SVG, so do that unless the design truly needs a photo (a restaurant's food, a product shot, a portfolio). Never ask the user for images or how imagery should work; decide yourself. When a photo is genuinely needed, find a real one with image_search (it searches the whole web like Google Images), pick the result that fits that exact section, and download it with fetch_image to a path under assets/. Every image in the markup must be that local file: never point an <img> or CSS background at a remote URL, and never use loremflickr, picsum or other random-photo services. If a downloaded image turns out broken or unrelated once you look at the page, delete it and pick another result.
947
1048
  - If a SKILLS entry below is a clear match for the task, use_skill it before starting - its instructions take priority over your own default approach for that kind of work. Do not use_skill speculatively; only when a listed skill actually matches what you are about to do. A name under LIKELY RELEVANT TO THIS REQUEST, if that section is present, was matched against your actual request from the full library - treat it exactly the same way: use_skill it before starting unless it's obviously a false match, do not silently ignore it in favor of guessing your own approach.
948
1049
  - EXCEPTION - this one is not speculative: if the task is to build or restyle any page a human will look at in a browser (a landing page, a small-business site, a portfolio, a dashboard, any HTML/CSS/UI), use_skill 'premium-web-design' before writing markup, even if the brief sounds tiny or mundane ("a site for a tea shop"). A plain-sounding brief is not permission for a flat, default-Bootstrap-looking result - Codeply's bar is that every generated page reads as deliberately designed. Skip this only if the user explicitly asked for something minimal/utilitarian/no-frills.
949
1050
  - EXCEPTION - this one is MANDATORY, not speculative, and comes before you write any markup for that same kind of task (a page or app screen a human will look at): call design_reference_search on the core screen(s) the app needs (an onboarding flow, a checkout, a settings screen, a to-do list's main view - whatever the brief actually calls for) before designing it from memory. It is a local library (no external account, no login, no network dependency) so it is always available - do not skip this step, and do not substitute your own guess at what that kind of screen "usually" looks like. Real shipped apps solve layout/hierarchy/empty-state problems in ways worth matching, not just imitating the vibe of. Only if it reports the library itself is missing on this machine should you say that plainly to the user once and continue from your own judgment.
@@ -1054,9 +1155,9 @@ function connectedServicesSection() {
1054
1155
  describe('supabase', 'Supabase', 'full Management API via supabase_api, SQL via supabase_sql');
1055
1156
  describe('vercel', 'Vercel', [vercelUser, 'full REST API via vercel_api'].filter(Boolean).join(' - '));
1056
1157
  describe('github', 'GitHub', githubUser);
1057
- describe('gmail', 'Gmail', gmailUser);
1158
+ describe('gmail', 'Gmail and Google Calendar', [gmailUser, 'drafts via gmail_draft, calendar via calendar_list/calendar_add'].filter(Boolean).join(' - '));
1058
1159
  describe('slack', 'Slack', '');
1059
- return `CONNECTED SERVICES\n${lines.join('\n')}\nA service marked "not connected" cannot be used - tell the user to connect it from Connect Apps rather than attempting it.`;
1160
+ return `CONNECTED SERVICES\n${lines.join('\n')}\nA service marked "not connected" cannot be used - tell the user to connect it from Connect Apps rather than attempting it. While publishing, call publish_connect instead: it lets the user connect in one click and waits.`;
1060
1161
  }
1061
1162
 
1062
1163
  const ROLE_INTRO = (role) =>
@@ -1328,7 +1429,7 @@ const NO_NATIVE_TOOLS_REMINDER =
1328
1429
  // unless their entry says toolMode: 'text', or CODEPLY_TOOLS=text is set.
1329
1430
  // A model that rejects tools is remembered for the rest of the session.
1330
1431
  const nativeUnsupported = new Set();
1331
- const MUTATING_ACTIONS = new Set(['write_file', 'edit_file', 'apply_patch', 'fetch_image', 'gmail_send', 'slack_post_message', 'vercel_deploy', 'supabase_create_project', 'supabase_delete_project', 'github_create_repo']);
1432
+ const MUTATING_ACTIONS = new Set(['write_file', 'edit_file', 'apply_patch', 'fetch_image', 'gmail_send', 'gmail_draft', 'calendar_add', 'slack_post_message', 'vercel_deploy', 'supabase_create_project', 'supabase_delete_project', 'github_create_repo', 'supabase_setup', 'supabase_schema', 'publish_deploy', 'publish_github']);
1332
1433
 
1333
1434
  /**
1334
1435
  * Native function names for MCP tools (mcp__server__tool, within the 64-char
@@ -1396,6 +1497,13 @@ function withoutEmDashes(text) {
1396
1497
 
1397
1498
  // ─── Loop ───────────────────────────────────────────────────────────────────
1398
1499
 
1500
+ // Thinking models (DeepSeek V4 and later) refuse the next step of a tool run
1501
+ // unless each assistant turn carries its own reasoning back. ai.js only sends
1502
+ // the field to providers that want it.
1503
+ function withReasoning(msg, reasoning) {
1504
+ return reasoning && reasoning.trim() ? { ...msg, reasoning_content: reasoning } : msg;
1505
+ }
1506
+
1399
1507
  /**
1400
1508
  * Run one user turn to completion.
1401
1509
  *
@@ -1428,7 +1536,7 @@ function withoutEmDashes(text) {
1428
1536
  * "claims an edit it didn't make this turn" check is skipped.
1429
1537
  * @yields {{type:string, ...}} text | reasoning | tool_start | tool_end | done | error | aborted
1430
1538
  */
1431
- export async function* runAgent({ userMessage, history, mode, cwd, approve, browser, images, signal, route, roleId, goal, maxSteps, verifyOnly, botPrompt, askBot }) {
1539
+ export async function* runAgent({ userMessage, history, mode, cwd, approve, browser, images, signal, route, roleId, goal, maxSteps, verifyOnly, botPrompt, askBot, botId }) {
1432
1540
  let readOnly = READ_ONLY_MODES.has(mode);
1433
1541
  const stepBudget = Math.max(1, maxSteps || MAX_STEPS);
1434
1542
  // OpenAI-shaped content array only when there's actually an image to carry -
@@ -1456,6 +1564,7 @@ export async function* runAgent({ userMessage, history, mode, cwd, approve, brow
1456
1564
  if (n === 'plan_exit') return m === 'Plan';
1457
1565
  if (n === 'plan_enter') return m === 'Build';
1458
1566
  if (n === 'ask_bot') return typeof askBot === 'function';
1567
+ if (n === 'reach_me' || n === 'watch_email') return reachLib.available();
1459
1568
  if (ro && MUTATING_ACTIONS.has(n)) return m === 'Plan' && (n === 'write_file' || n === 'edit_file');
1460
1569
  return true;
1461
1570
  });
@@ -1469,7 +1578,8 @@ export async function* runAgent({ userMessage, history, mode, cwd, approve, brow
1469
1578
  ];
1470
1579
 
1471
1580
  // fileState: path -> mtime when this turn last read/wrote it (see tools.mjs).
1472
- const ctx = { cwd, approve, browser, signal, mode, route, fileState: new Map(), ask: typeof approve?.ask === 'function' ? approve.ask : null, askBot: typeof askBot === 'function' ? askBot : null };
1581
+ // userMessage lets the publish tools refuse when nobody asked to publish.
1582
+ const ctx = { cwd, approve, browser, signal, mode, route, userMessage, fileState: new Map(), ask: typeof approve?.ask === 'function' ? approve.ask : null, askBot: typeof askBot === 'function' ? askBot : null, botId: botId || null };
1473
1583
  const recentCallKeys = []; // executed calls, in order, for the stuck-loop guard
1474
1584
  const lastResultFor = new Map(); // call key -> its most recent result
1475
1585
  const transcript = [{ role: 'user', content: userMessage }];
@@ -1573,7 +1683,6 @@ export async function* runAgent({ userMessage, history, mode, cwd, approve, brow
1573
1683
  // wrong entries now. They are only shortcuts; starting them over is safe.
1574
1684
  servedCalls.clear();
1575
1685
  readIndexByPath.clear();
1576
- yield { type: 'notice', level: 'info', text: 'Summarized earlier steps of this task to make room.' };
1577
1686
  outgoing = trimTranscript(messages, budget);
1578
1687
  }
1579
1688
  if (outgoing !== messages) {
@@ -1621,7 +1730,7 @@ export async function* runAgent({ userMessage, history, mode, cwd, approve, brow
1621
1730
  // `reply` and not shown inline - so the UI can offer it as an optional,
1622
1731
  // collapsed "thought for Xs" the user opens on demand instead of dumping
1623
1732
  // raw reasoning into the chat unconditionally.
1624
- const reasoning = result.data?.choices?.[0]?.message?.reasoning || '';
1733
+ const reasoning = result.data?.choices?.[0]?.message?.reasoning || result.data?.choices?.[0]?.message?.reasoning_content || '';
1625
1734
  if (reasoning.trim()) {
1626
1735
  yield { type: 'reasoning', text: reasoning.trim(), ms: stepMs };
1627
1736
  }
@@ -1633,7 +1742,7 @@ export async function* runAgent({ userMessage, history, mode, cwd, approve, brow
1633
1742
  const conv = toolCallsToTags(reply, replyMsg.tool_calls, PARAMS, mcpNames.fromNative);
1634
1743
  reply = conv.text;
1635
1744
  if (conv.problems.length && !reply.includes('<codeply:')) {
1636
- messages.push({ role: 'assistant', content: reply || '(tool call)' });
1745
+ messages.push(withReasoning({ role: 'assistant', content: reply || '(tool call)' }, reasoning));
1637
1746
  messages.push({ role: 'user', content: `[system] Your tool call could not be run: ${conv.problems.join('; ')}. Call one of the provided tools with valid arguments.` });
1638
1747
  continue;
1639
1748
  }
@@ -1664,7 +1773,7 @@ export async function* runAgent({ userMessage, history, mode, cwd, approve, brow
1664
1773
  // was written blind, before any result, and leaving it in the history
1665
1774
  // teaches the model to treat its own guesses as things that happened.
1666
1775
  const lastEnd = toRun.length ? toRun[toRun.length - 1].end : undefined;
1667
- messages.push({ role: 'assistant', content: typeof lastEnd === 'number' ? reply.slice(0, lastEnd) : reply });
1776
+ messages.push(withReasoning({ role: 'assistant', content: typeof lastEnd === 'number' ? reply.slice(0, lastEnd) : reply }, reasoning));
1668
1777
 
1669
1778
  if (calls.length === 0) {
1670
1779
  // Protocol debris first: a truncated or malformed reply's raw text is