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.
- package/LICENSE +21 -0
- package/THIRD_PARTY_NOTICES.md +65 -63
- package/bin/codeply.js +1 -1
- package/lib/agent.mjs +133 -24
- package/lib/ai.js +268 -9
- package/lib/ai.mjs +6 -6
- package/lib/apply-patch.js +217 -217
- package/lib/arity-table.json +138 -138
- package/lib/arity.js +70 -70
- package/lib/auth.mjs +6 -6
- package/lib/bots.js +82 -17
- package/lib/chatgpt.js +282 -0
- package/lib/cloud-browser.mjs +143 -143
- package/lib/cloud.mjs +1250 -1144
- package/lib/commands.js +103 -103
- package/lib/config.js +83 -3
- package/lib/design-library/assemble-artifact.mjs +21 -21
- package/lib/design-library/cleanup.mjs +45 -45
- package/lib/design-library/index.json +22379 -22379
- package/lib/design-library/make-table-data.mjs +39 -39
- package/lib/diagnostics.js +192 -192
- package/lib/edit-engine.js +364 -364
- package/lib/github-agent.mjs +311 -311
- package/lib/history.js +75 -75
- package/lib/mail-watch.js +504 -0
- package/lib/mcp.js +258 -258
- package/lib/model-sync.js +114 -0
- package/lib/native-tools.mjs +16 -1
- package/lib/oauth-connectors.js +146 -24
- package/lib/permissions.js +109 -109
- package/lib/plugins.js +353 -353
- package/lib/publish.js +916 -0
- package/lib/reach.js +67 -0
- package/lib/server.mjs +457 -457
- package/lib/session-db.js +220 -220
- package/lib/share.js +168 -168
- package/lib/skills.js +2 -0
- package/lib/snapshot.js +146 -146
- package/lib/telemetry.js +102 -0
- package/lib/terminal-hints.js +154 -154
- package/lib/tools.mjs +316 -14
- package/lib/typecheck-worker.js +147 -147
- package/lib/web-tools.js +209 -158
- package/package.json +49 -49
- package/skills/SOURCE.md +58 -58
- package/skills/accessibility/SKILL.md +147 -147
- package/skills/agent-architecture-audit/SKILL.md +257 -257
- package/skills/agent-eval/SKILL.md +147 -147
- package/skills/agent-harness-construction/SKILL.md +74 -74
- package/skills/agent-introspection-debugging/SKILL.md +154 -154
- package/skills/agent-payment-x402/SKILL.md +225 -225
- package/skills/agent-self-evaluation/SKILL.md +182 -182
- package/skills/agent-self-evaluation/references/evaluation-criteria.md +71 -71
- package/skills/agent-self-evaluation/references/hook-integration.md +64 -64
- package/skills/agent-sort/SKILL.md +216 -216
- package/skills/agentic-engineering/SKILL.md +64 -64
- package/skills/agentic-os/SKILL.md +388 -388
- package/skills/ai-first-engineering/SKILL.md +52 -52
- package/skills/ai-regression-testing/SKILL.md +386 -386
- package/skills/android-clean-architecture/SKILL.md +340 -340
- package/skills/angular-developer/SKILL.md +155 -155
- package/skills/angular-developer/references/angular-animations.md +160 -160
- package/skills/angular-developer/references/angular-aria.md +410 -410
- package/skills/angular-developer/references/cli.md +86 -86
- package/skills/angular-developer/references/component-harnesses.md +59 -59
- package/skills/angular-developer/references/component-styling.md +91 -91
- package/skills/angular-developer/references/components.md +117 -117
- package/skills/angular-developer/references/creating-services.md +97 -97
- package/skills/angular-developer/references/data-resolvers.md +69 -69
- package/skills/angular-developer/references/define-routes.md +67 -67
- package/skills/angular-developer/references/defining-providers.md +72 -72
- package/skills/angular-developer/references/di-fundamentals.md +120 -120
- package/skills/angular-developer/references/e2e-testing.md +56 -56
- package/skills/angular-developer/references/effects.md +83 -83
- package/skills/angular-developer/references/hierarchical-injectors.md +43 -43
- package/skills/angular-developer/references/host-elements.md +80 -80
- package/skills/angular-developer/references/injection-context.md +63 -63
- package/skills/angular-developer/references/inputs.md +101 -101
- package/skills/angular-developer/references/linked-signal.md +59 -59
- package/skills/angular-developer/references/loading-strategies.md +61 -61
- package/skills/angular-developer/references/mcp.md +108 -108
- package/skills/angular-developer/references/navigate-to-routes.md +69 -69
- package/skills/angular-developer/references/outputs.md +86 -86
- package/skills/angular-developer/references/reactive-forms.md +122 -122
- package/skills/angular-developer/references/rendering-strategies.md +44 -44
- package/skills/angular-developer/references/resource.md +77 -77
- package/skills/angular-developer/references/route-animations.md +56 -56
- package/skills/angular-developer/references/route-guards.md +52 -52
- package/skills/angular-developer/references/router-lifecycle.md +45 -45
- package/skills/angular-developer/references/router-testing.md +87 -87
- package/skills/angular-developer/references/show-routes-with-outlets.md +68 -68
- package/skills/angular-developer/references/signal-forms.md +795 -795
- package/skills/angular-developer/references/signals-overview.md +94 -94
- package/skills/angular-developer/references/tailwind-css.md +69 -69
- package/skills/angular-developer/references/template-driven-forms.md +114 -114
- package/skills/angular-developer/references/testing-fundamentals.md +65 -65
- package/skills/api-connector-builder/SKILL.md +121 -121
- package/skills/api-design/SKILL.md +524 -524
- package/skills/architecture-decision-records/SKILL.md +180 -180
- package/skills/article-writing/SKILL.md +80 -80
- package/skills/automation-audit-ops/SKILL.md +143 -143
- package/skills/autonomous-agent-harness/SKILL.md +274 -274
- package/skills/autonomous-loops/SKILL.md +611 -611
- package/skills/backend-patterns/SKILL.md +562 -562
- package/skills/benchmark/SKILL.md +95 -95
- package/skills/benchmark-methodology/SKILL.md +191 -191
- package/skills/benchmark-optimization-loop/SKILL.md +71 -71
- package/skills/blender-motion-state-inspection/SKILL.md +165 -165
- package/skills/blueprint/SKILL.md +106 -106
- package/skills/brand-discovery/SKILL.md +145 -145
- package/skills/brand-discovery/references/10_purpose-why.md +40 -40
- package/skills/brand-discovery/references/20_positioning.md +44 -44
- package/skills/brand-discovery/references/30_audience-niche.md +52 -52
- package/skills/brand-discovery/references/40_personality-archetype.md +57 -57
- package/skills/brand-discovery/references/50_voice-tone.md +59 -59
- package/skills/brand-discovery/references/60_narrative-story.md +50 -50
- package/skills/brand-discovery/references/70_founder-tension.md +49 -49
- package/skills/brand-discovery/references/90_SYNTHESIS.md +133 -133
- package/skills/brand-voice/SKILL.md +98 -98
- package/skills/brand-voice/references/voice-profile-schema.md +55 -55
- package/skills/browser-qa/SKILL.md +105 -105
- package/skills/bun-runtime/SKILL.md +85 -85
- package/skills/canary-watch/SKILL.md +108 -108
- package/skills/carrier-relationship-management/SKILL.md +212 -212
- package/skills/cisco-ios-patterns/SKILL.md +164 -164
- package/skills/ck/SKILL.md +148 -148
- package/skills/claude-devfleet/SKILL.md +112 -112
- package/skills/click-path-audit/SKILL.md +245 -245
- package/skills/clickhouse-io/SKILL.md +445 -445
- package/skills/code-tour/SKILL.md +254 -254
- package/skills/codebase-onboarding/SKILL.md +234 -234
- package/skills/codehealth-mcp/SKILL.md +167 -167
- package/skills/coding-standards/SKILL.md +551 -551
- package/skills/competitive-platform-analysis/SKILL.md +214 -214
- package/skills/competitive-report-structure/SKILL.md +162 -162
- package/skills/compose-multiplatform-patterns/SKILL.md +300 -300
- package/skills/config-gc/SKILL.md +120 -120
- package/skills/configure-ecc/SKILL.md +385 -385
- package/skills/connections-optimizer/SKILL.md +190 -190
- package/skills/content-engine/SKILL.md +132 -132
- package/skills/content-hash-cache-pattern/SKILL.md +162 -162
- package/skills/context-budget/SKILL.md +136 -136
- package/skills/continuous-agent-loop/SKILL.md +46 -46
- package/skills/continuous-learning/SKILL.md +132 -132
- package/skills/continuous-learning-v2/SKILL.md +361 -361
- package/skills/contract-first/SKILL.md +287 -287
- package/skills/cost-aware-llm-pipeline/SKILL.md +184 -184
- package/skills/cost-tracking/SKILL.md +97 -97
- package/skills/council/SKILL.md +204 -204
- package/skills/cpp-coding-standards/SKILL.md +724 -724
- package/skills/cpp-testing/SKILL.md +325 -325
- package/skills/crosspost/SKILL.md +112 -112
- package/skills/csharp-testing/SKILL.md +322 -322
- package/skills/customer-billing-ops/SKILL.md +141 -141
- package/skills/customs-trade-compliance/SKILL.md +263 -263
- package/skills/dart-flutter-patterns/SKILL.md +564 -564
- package/skills/dashboard-builder/SKILL.md +109 -109
- package/skills/data-scraper-agent/SKILL.md +765 -765
- package/skills/data-throughput-accelerator/SKILL.md +74 -74
- package/skills/database-migrations/SKILL.md +430 -430
- package/skills/deep-research/SKILL.md +160 -160
- package/skills/defi-amm-security/SKILL.md +167 -167
- package/skills/delivery-gate/SKILL.md +126 -126
- package/skills/deployment-patterns/SKILL.md +428 -428
- package/skills/design-system/SKILL.md +83 -83
- package/skills/django-celery/SKILL.md +458 -458
- package/skills/django-patterns/SKILL.md +735 -735
- package/skills/django-security/SKILL.md +644 -644
- package/skills/django-tdd/SKILL.md +730 -730
- package/skills/django-verification/SKILL.md +470 -470
- package/skills/dmux-workflows/SKILL.md +192 -192
- package/skills/docker-patterns/SKILL.md +365 -365
- package/skills/documentation-lookup/SKILL.md +91 -91
- package/skills/dotnet-patterns/SKILL.md +322 -322
- package/skills/dynamic-workflow-mode/SKILL.md +124 -124
- package/skills/e2e-testing/SKILL.md +327 -327
- package/skills/ecc-guide/SKILL.md +190 -190
- package/skills/ecc-recipes/SKILL.md +149 -149
- package/skills/ecc-tools-cost-audit/SKILL.md +161 -161
- package/skills/email-ops/SKILL.md +122 -122
- package/skills/energy-procurement/SKILL.md +228 -228
- package/skills/enterprise-agent-ops/SKILL.md +51 -51
- package/skills/error-handling/SKILL.md +377 -377
- package/skills/eval-harness/SKILL.md +271 -271
- package/skills/evm-token-decimals/SKILL.md +131 -131
- package/skills/exa-search/SKILL.md +108 -108
- package/skills/fal-ai-media/SKILL.md +289 -289
- package/skills/fastapi-patterns/SKILL.md +514 -514
- package/skills/finance-billing-ops/SKILL.md +128 -128
- package/skills/flox-environments/SKILL.md +497 -497
- package/skills/flutter-dart-code-review/SKILL.md +436 -436
- package/skills/foundation-models-on-device/SKILL.md +243 -243
- package/skills/frontend-a11y/SKILL.md +446 -446
- package/skills/frontend-design-direction/SKILL.md +93 -93
- package/skills/frontend-patterns/SKILL.md +657 -657
- package/skills/frontend-slides/SKILL.md +185 -185
- package/skills/fsharp-testing/SKILL.md +281 -281
- package/skills/gan-style-harness/SKILL.md +279 -279
- package/skills/gateguard/SKILL.md +133 -133
- package/skills/generating-python-installer/SKILL.md +820 -820
- package/skills/git-workflow/SKILL.md +716 -716
- package/skills/github-ops/SKILL.md +145 -145
- package/skills/golang-patterns/SKILL.md +676 -676
- package/skills/golang-testing/SKILL.md +721 -721
- package/skills/google-workspace-ops/SKILL.md +96 -96
- package/skills/growth-log/SKILL.md +128 -128
- package/skills/healthcare-cdss-patterns/SKILL.md +246 -246
- package/skills/healthcare-emr-patterns/SKILL.md +160 -160
- package/skills/healthcare-eval-harness/SKILL.md +208 -208
- package/skills/healthcare-phi-compliance/SKILL.md +146 -146
- package/skills/hermes-imports/SKILL.md +89 -89
- package/skills/hexagonal-architecture/SKILL.md +277 -277
- package/skills/hipaa-compliance/SKILL.md +79 -79
- package/skills/homelab-network-readiness/SKILL.md +170 -170
- package/skills/homelab-network-setup/SKILL.md +130 -130
- package/skills/homelab-pihole-dns/SKILL.md +275 -275
- package/skills/homelab-vlan-segmentation/SKILL.md +312 -312
- package/skills/homelab-wireguard-vpn/SKILL.md +306 -306
- package/skills/hookify-rules/SKILL.md +128 -128
- package/skills/inherit-legacy-style/SKILL.md +157 -157
- package/skills/intent-driven-development/SKILL.md +360 -360
- package/skills/inventory-demand-planning/SKILL.md +247 -247
- package/skills/investor-materials/SKILL.md +97 -97
- package/skills/investor-outreach/SKILL.md +92 -92
- package/skills/ios-icon-gen/SKILL.md +158 -158
- package/skills/iterative-retrieval/SKILL.md +212 -212
- package/skills/ito-basket-compare/SKILL.md +64 -64
- package/skills/ito-compute/SKILL.md +129 -129
- package/skills/ito-data-atlas-agent/SKILL.md +64 -64
- package/skills/ito-market-intelligence/SKILL.md +61 -61
- package/skills/ito-trade-planner/SKILL.md +68 -68
- package/skills/java-coding-standards/SKILL.md +384 -384
- package/skills/jira-integration/SKILL.md +303 -303
- package/skills/jpa-patterns/SKILL.md +152 -152
- package/skills/knowledge-ops/SKILL.md +155 -155
- package/skills/kotlin-coroutines-flows/SKILL.md +285 -285
- package/skills/kotlin-exposed-patterns/SKILL.md +720 -720
- package/skills/kotlin-ktor-patterns/SKILL.md +690 -690
- package/skills/kotlin-patterns/SKILL.md +712 -712
- package/skills/kotlin-testing/SKILL.md +825 -825
- package/skills/kubernetes-patterns/SKILL.md +756 -756
- package/skills/laravel-patterns/SKILL.md +416 -416
- package/skills/laravel-plugin-discovery/SKILL.md +230 -230
- package/skills/laravel-security/SKILL.md +948 -948
- package/skills/laravel-tdd/SKILL.md +675 -675
- package/skills/laravel-verification/SKILL.md +180 -180
- package/skills/latency-critical-systems/SKILL.md +75 -75
- package/skills/lead-intelligence/SKILL.md +322 -322
- package/skills/liquid-glass-design/SKILL.md +279 -279
- package/skills/llm-trading-agent-security/SKILL.md +147 -147
- package/skills/logistics-exception-management/SKILL.md +222 -222
- package/skills/loop-design-check/SKILL.md +143 -143
- package/skills/mailtrap-email-integration/SKILL.md +77 -77
- package/skills/make-interfaces-feel-better/SKILL.md +152 -152
- package/skills/manim-video/SKILL.md +90 -90
- package/skills/market-research/SKILL.md +76 -76
- package/skills/marketing-campaign/SKILL.md +114 -114
- package/skills/mcp-server-patterns/SKILL.md +70 -70
- package/skills/messages-ops/SKILL.md +105 -105
- package/skills/ml-adoption-playbook/SKILL.md +57 -57
- package/skills/mle-workflow/SKILL.md +348 -348
- package/skills/motion-advanced/SKILL.md +596 -596
- package/skills/motion-foundations/SKILL.md +299 -299
- package/skills/motion-patterns/SKILL.md +434 -434
- package/skills/motion-ui/SKILL.md +576 -576
- package/skills/mysql-patterns/SKILL.md +413 -413
- package/skills/nanoclaw-repl/SKILL.md +34 -34
- package/skills/nestjs-patterns/SKILL.md +231 -231
- package/skills/netmiko-ssh-automation/SKILL.md +174 -174
- package/skills/network-bgp-diagnostics/SKILL.md +168 -168
- package/skills/network-config-validation/SKILL.md +211 -211
- package/skills/network-interface-health/SKILL.md +153 -153
- package/skills/nextjs-turbopack/SKILL.md +58 -58
- package/skills/nodejs-keccak256/SKILL.md +103 -103
- package/skills/nutrient-document-processing/SKILL.md +168 -168
- package/skills/nuxt4-patterns/SKILL.md +101 -101
- package/skills/openclaw-persona-forge/SKILL.md +289 -289
- package/skills/openclaw-persona-forge/references/avatar-style.md +124 -124
- package/skills/openclaw-persona-forge/references/boundary-rules.md +53 -53
- package/skills/openclaw-persona-forge/references/error-handling.md +53 -53
- package/skills/openclaw-persona-forge/references/identity-tension.md +48 -48
- package/skills/openclaw-persona-forge/references/naming-system.md +39 -39
- package/skills/openclaw-persona-forge/references/output-template.md +166 -166
- package/skills/opensource-pipeline/SKILL.md +256 -256
- package/skills/orch-add-feature/SKILL.md +45 -45
- package/skills/orch-build-mvp/SKILL.md +49 -49
- package/skills/orch-change-feature/SKILL.md +43 -43
- package/skills/orch-fix-defect/SKILL.md +43 -43
- package/skills/orch-pipeline/SKILL.md +121 -121
- package/skills/orch-refine-code/SKILL.md +44 -44
- package/skills/parallel-execution-optimizer/SKILL.md +74 -74
- package/skills/perl-patterns/SKILL.md +505 -505
- package/skills/perl-security/SKILL.md +504 -504
- package/skills/perl-testing/SKILL.md +476 -476
- package/skills/plan-canvas/SKILL.md +153 -153
- package/skills/plan-orchestrate/SKILL.md +263 -263
- package/skills/plankton-code-quality/SKILL.md +237 -237
- package/skills/postgres-patterns/SKILL.md +148 -148
- package/skills/prediction-market-oracle-research/SKILL.md +64 -64
- package/skills/prediction-market-risk-review/SKILL.md +61 -61
- package/skills/premium-web-design/SKILL.md +154 -154
- package/skills/prisma-patterns/SKILL.md +401 -401
- package/skills/product-capability/SKILL.md +142 -142
- package/skills/product-lens/SKILL.md +93 -93
- package/skills/production-audit/SKILL.md +207 -207
- package/skills/production-scheduling/SKILL.md +238 -238
- package/skills/project-flow-ops/SKILL.md +112 -112
- package/skills/prompt-optimizer/SKILL.md +398 -398
- package/skills/publish-website/SKILL.md +76 -0
- package/skills/python-patterns/SKILL.md +751 -751
- package/skills/python-testing/SKILL.md +817 -817
- package/skills/pytorch-patterns/SKILL.md +397 -397
- package/skills/quality-nonconformance/SKILL.md +260 -260
- package/skills/quarkus-patterns/SKILL.md +723 -723
- package/skills/quarkus-security/SKILL.md +468 -468
- package/skills/quarkus-tdd/SKILL.md +812 -812
- package/skills/quarkus-verification/SKILL.md +480 -480
- package/skills/ralphinho-rfc-pipeline/SKILL.md +68 -68
- package/skills/react-native-patterns/SKILL.md +326 -326
- package/skills/react-patterns/SKILL.md +342 -342
- package/skills/react-performance/SKILL.md +575 -575
- package/skills/react-testing/SKILL.md +424 -424
- package/skills/recsys-pipeline-architect/SKILL.md +115 -115
- package/skills/recursive-decision-ledger/SKILL.md +81 -81
- package/skills/redis-patterns/SKILL.md +404 -404
- package/skills/regex-vs-llm-structured-text/SKILL.md +221 -221
- package/skills/remotion-video-creation/SKILL.md +43 -43
- package/skills/repo-scan/SKILL.md +79 -79
- package/skills/research-ops/SKILL.md +113 -113
- package/skills/returns-reverse-logistics/SKILL.md +240 -240
- package/skills/rules-distill/SKILL.md +265 -265
- package/skills/rust-patterns/SKILL.md +500 -500
- package/skills/rust-testing/SKILL.md +501 -501
- package/skills/safety-guard/SKILL.md +76 -76
- package/skills/santa-method/SKILL.md +307 -307
- package/skills/scientific-db-pubmed-database/SKILL.md +176 -176
- package/skills/scientific-db-uspto-database/SKILL.md +178 -178
- package/skills/scientific-pkg-gget/SKILL.md +167 -167
- package/skills/scientific-thinking-literature-review/SKILL.md +193 -193
- package/skills/scientific-thinking-scholar-evaluation/SKILL.md +161 -161
- package/skills/search-first/SKILL.md +183 -183
- package/skills/security-bounty-hunter/SKILL.md +100 -100
- package/skills/security-review/SKILL.md +504 -504
- package/skills/security-scan/SKILL.md +166 -166
- package/skills/seo/SKILL.md +155 -155
- package/skills/skill-comply/SKILL.md +59 -59
- package/skills/skill-scout/SKILL.md +141 -141
- package/skills/skill-stocktake/SKILL.md +195 -195
- package/skills/social-graph-ranker/SKILL.md +155 -155
- package/skills/social-publisher/SKILL.md +130 -130
- package/skills/springboot-patterns/SKILL.md +315 -315
- package/skills/springboot-security/SKILL.md +273 -273
- package/skills/springboot-tdd/SKILL.md +159 -159
- package/skills/springboot-verification/SKILL.md +232 -232
- package/skills/strategic-compact/SKILL.md +142 -142
- package/skills/swift-actor-persistence/SKILL.md +144 -144
- package/skills/swift-concurrency-6-2/SKILL.md +216 -216
- package/skills/swift-protocol-di-testing/SKILL.md +191 -191
- package/skills/swiftui-patterns/SKILL.md +259 -259
- package/skills/taste/SKILL.md +264 -264
- package/skills/taste/references/genre-taxonomy.md +87 -87
- package/skills/tdd-workflow/SKILL.md +583 -583
- package/skills/team-agent-orchestration/SKILL.md +111 -111
- package/skills/team-builder/SKILL.md +169 -169
- package/skills/terminal-ops/SKILL.md +110 -110
- package/skills/tinystruct-patterns/SKILL.md +279 -279
- package/skills/tinystruct-patterns/references/architecture.md +90 -90
- package/skills/tinystruct-patterns/references/data-handling.md +60 -60
- package/skills/tinystruct-patterns/references/database.md +99 -99
- package/skills/tinystruct-patterns/references/routing.md +64 -64
- package/skills/tinystruct-patterns/references/system-usage.md +97 -97
- package/skills/tinystruct-patterns/references/testing.md +72 -72
- package/skills/token-budget-advisor/SKILL.md +134 -134
- package/skills/ui-demo/SKILL.md +466 -466
- package/skills/ui-to-vue/SKILL.md +135 -135
- package/skills/uncloud/SKILL.md +344 -344
- package/skills/unified-memory/SKILL.md +170 -170
- package/skills/unified-notifications-ops/SKILL.md +188 -188
- package/skills/verification-loop/SKILL.md +129 -129
- package/skills/video-editing/SKILL.md +311 -311
- package/skills/videodb/SKILL.md +375 -375
- package/skills/visa-doc-translate/SKILL.md +117 -117
- package/skills/vite-patterns/SKILL.md +450 -450
- package/skills/vue-patterns/SKILL.md +471 -471
- package/skills/windows-desktop-e2e/SKILL.md +888 -888
- package/skills/workspace-surface-audit/SKILL.md +126 -126
- 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.
|
package/THIRD_PARTY_NOTICES.md
CHANGED
|
@@ -1,63 +1,65 @@
|
|
|
1
|
-
# Third-party notices
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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
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 =
|
|
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
|
|
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
|
|
259
|
-
'
|
|
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',
|
|
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>
|
|
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
|
|
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
|
-
-
|
|
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
|
-
|
|
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
|