codeply-cli 0.5.6 → 0.6.0
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 -21
- package/THIRD_PARTY_NOTICES.md +65 -65
- package/bin/codeply.js +8 -3
- package/lib/agent.mjs +2596 -2268
- package/lib/ai.js +135 -27
- 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/autopilot.js +84 -0
- package/lib/bot-mail.js +46 -0
- package/lib/bots.js +142 -15
- package/lib/brain.js +914 -0
- package/lib/call-assist.js +120 -0
- package/lib/chatgpt.js +282 -282
- package/lib/cloud-browser.mjs +143 -143
- package/lib/cloud.mjs +1396 -1320
- package/lib/commands.js +103 -103
- package/lib/computer.js +136 -0
- 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/design-tools.mjs +173 -0
- package/lib/diagnostics.js +192 -192
- package/lib/dsh-acp.mjs +444 -0
- package/lib/edit-engine.js +364 -364
- package/lib/github-agent.mjs +326 -326
- package/lib/handoff.mjs +245 -0
- package/lib/history.js +78 -75
- package/lib/life-sources.js +319 -0
- package/lib/life-store.js +356 -0
- package/lib/life-triggers.js +286 -0
- package/lib/life.js +487 -0
- package/lib/mail-watch.js +3 -3
- package/lib/mcp.js +258 -258
- package/lib/native-tools.mjs +17 -5
- package/lib/oauth-connectors.js +76 -21
- package/lib/permissions.js +109 -109
- package/lib/plugins.js +356 -353
- package/lib/reach.js +67 -67
- package/lib/render-md.mjs +647 -617
- package/lib/screen.js +77 -0
- package/lib/server.mjs +458 -457
- package/lib/session-db.js +220 -220
- package/lib/share.js +208 -168
- package/lib/skills.js +4 -1
- package/lib/snapshot.js +146 -146
- package/lib/subagents.js +4 -2
- package/lib/telemetry.js +105 -105
- package/lib/terminal-hints.js +154 -154
- package/lib/textarea.mjs +264 -258
- package/lib/tools.mjs +326 -40
- package/lib/tui.mjs +1459 -1086
- package/lib/typecheck-worker.js +147 -147
- package/lib/web-tools.js +209 -209
- package/package.json +1 -1
- 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/codeply-taste/LICENSE +21 -0
- package/skills/codeply-taste/SKILL.md +100 -0
- package/skills/codeply-taste/SOURCE.md +10 -0
- package/skills/codeply-taste/assets/base.css +100 -0
- package/skills/codeply-taste/assets/base.js +37 -0
- package/skills/codeply-taste/library/directions.json +1078 -0
- package/skills/codeply-taste/library/heroes.json +894 -0
- package/skills/codeply-taste/library/motions.json +57 -0
- package/skills/codeply-taste/library/palettes.json +1485 -0
- package/skills/codeply-taste/library/photos.json +7240 -0
- package/skills/codeply-taste/library/sections.json +4136 -0
- package/skills/codeply-taste/library/sites.json +7274 -0
- package/skills/codeply-taste/library/type.json +2024 -0
- package/skills/codeply-taste/references/colour.md +141 -0
- package/skills/codeply-taste/references/copy.md +177 -0
- package/skills/codeply-taste/references/critique.md +171 -0
- package/skills/codeply-taste/references/imagery.md +377 -0
- package/skills/codeply-taste/references/layout.md +178 -0
- package/skills/codeply-taste/references/motion.md +292 -0
- package/skills/codeply-taste/references/research.md +306 -0
- package/skills/codeply-taste/references/tells.md +115 -0
- package/skills/codeply-taste/references/type.md +170 -0
- package/skills/codeply-taste/scripts/assets.mjs +865 -0
- package/skills/codeply-taste/scripts/draw.mjs +525 -0
- package/skills/codeply-taste/scripts/inspect.mjs +205 -0
- package/skills/codeply-taste/scripts/lib/cdp.mjs +205 -0
- package/skills/codeply-taste/scripts/lib/probe.mjs +569 -0
- package/skills/codeply-taste/scripts/lib/rules.mjs +137 -0
- package/skills/codeply-taste/scripts/lint.mjs +108 -0
- 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/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/lib/arity-table.json
CHANGED
|
@@ -1,138 +1,138 @@
|
|
|
1
|
-
{
|
|
2
|
-
"cat": 1,
|
|
3
|
-
"cd": 1,
|
|
4
|
-
"chmod": 1,
|
|
5
|
-
"chown": 1,
|
|
6
|
-
"cp": 1,
|
|
7
|
-
"echo": 1,
|
|
8
|
-
"env": 1,
|
|
9
|
-
"export": 1,
|
|
10
|
-
"grep": 1,
|
|
11
|
-
"kill": 1,
|
|
12
|
-
"killall": 1,
|
|
13
|
-
"ln": 1,
|
|
14
|
-
"ls": 1,
|
|
15
|
-
"mkdir": 1,
|
|
16
|
-
"mv": 1,
|
|
17
|
-
"ps": 1,
|
|
18
|
-
"pwd": 1,
|
|
19
|
-
"rm": 1,
|
|
20
|
-
"rmdir": 1,
|
|
21
|
-
"sleep": 1,
|
|
22
|
-
"source": 1,
|
|
23
|
-
"tail": 1,
|
|
24
|
-
"touch": 1,
|
|
25
|
-
"unset": 1,
|
|
26
|
-
"which": 1,
|
|
27
|
-
"aws": 3,
|
|
28
|
-
"az": 3,
|
|
29
|
-
"bazel": 2,
|
|
30
|
-
"brew": 2,
|
|
31
|
-
"bun": 2,
|
|
32
|
-
"bun run": 3,
|
|
33
|
-
"bun x": 3,
|
|
34
|
-
"cargo": 2,
|
|
35
|
-
"cargo add": 3,
|
|
36
|
-
"cargo run": 3,
|
|
37
|
-
"cdk": 2,
|
|
38
|
-
"cf": 2,
|
|
39
|
-
"cmake": 2,
|
|
40
|
-
"composer": 2,
|
|
41
|
-
"consul": 2,
|
|
42
|
-
"consul kv": 3,
|
|
43
|
-
"crictl": 2,
|
|
44
|
-
"deno": 2,
|
|
45
|
-
"deno task": 3,
|
|
46
|
-
"doctl": 3,
|
|
47
|
-
"docker": 2,
|
|
48
|
-
"docker builder": 3,
|
|
49
|
-
"docker compose": 3,
|
|
50
|
-
"docker container": 3,
|
|
51
|
-
"docker image": 3,
|
|
52
|
-
"docker network": 3,
|
|
53
|
-
"docker volume": 3,
|
|
54
|
-
"eksctl": 2,
|
|
55
|
-
"eksctl create": 3,
|
|
56
|
-
"firebase": 2,
|
|
57
|
-
"flyctl": 2,
|
|
58
|
-
"gcloud": 3,
|
|
59
|
-
"gh": 3,
|
|
60
|
-
"git": 2,
|
|
61
|
-
"git config": 3,
|
|
62
|
-
"git remote": 3,
|
|
63
|
-
"git stash": 3,
|
|
64
|
-
"go": 2,
|
|
65
|
-
"gradle": 2,
|
|
66
|
-
"helm": 2,
|
|
67
|
-
"heroku": 2,
|
|
68
|
-
"hugo": 2,
|
|
69
|
-
"ip": 2,
|
|
70
|
-
"ip addr": 3,
|
|
71
|
-
"ip link": 3,
|
|
72
|
-
"ip netns": 3,
|
|
73
|
-
"ip route": 3,
|
|
74
|
-
"kind": 2,
|
|
75
|
-
"kind create": 3,
|
|
76
|
-
"kubectl": 2,
|
|
77
|
-
"kubectl kustomize": 3,
|
|
78
|
-
"kubectl rollout": 3,
|
|
79
|
-
"kustomize": 2,
|
|
80
|
-
"make": 2,
|
|
81
|
-
"mc": 2,
|
|
82
|
-
"mc admin": 3,
|
|
83
|
-
"minikube": 2,
|
|
84
|
-
"mongosh": 2,
|
|
85
|
-
"mysql": 2,
|
|
86
|
-
"mvn": 2,
|
|
87
|
-
"ng": 2,
|
|
88
|
-
"npm": 2,
|
|
89
|
-
"npm exec": 3,
|
|
90
|
-
"npm init": 3,
|
|
91
|
-
"npm run": 3,
|
|
92
|
-
"npm view": 3,
|
|
93
|
-
"nvm": 2,
|
|
94
|
-
"nx": 2,
|
|
95
|
-
"openssl": 2,
|
|
96
|
-
"openssl req": 3,
|
|
97
|
-
"openssl x509": 3,
|
|
98
|
-
"pip": 2,
|
|
99
|
-
"pipenv": 2,
|
|
100
|
-
"pnpm": 2,
|
|
101
|
-
"pnpm dlx": 3,
|
|
102
|
-
"pnpm exec": 3,
|
|
103
|
-
"pnpm run": 3,
|
|
104
|
-
"poetry": 2,
|
|
105
|
-
"podman": 2,
|
|
106
|
-
"podman container": 3,
|
|
107
|
-
"podman image": 3,
|
|
108
|
-
"psql": 2,
|
|
109
|
-
"pulumi": 2,
|
|
110
|
-
"pulumi stack": 3,
|
|
111
|
-
"pyenv": 2,
|
|
112
|
-
"python": 2,
|
|
113
|
-
"rake": 2,
|
|
114
|
-
"rbenv": 2,
|
|
115
|
-
"redis-cli": 2,
|
|
116
|
-
"rustup": 2,
|
|
117
|
-
"serverless": 2,
|
|
118
|
-
"sfdx": 3,
|
|
119
|
-
"skaffold": 2,
|
|
120
|
-
"sls": 2,
|
|
121
|
-
"sst": 2,
|
|
122
|
-
"swift": 2,
|
|
123
|
-
"systemctl": 2,
|
|
124
|
-
"terraform": 2,
|
|
125
|
-
"terraform workspace": 3,
|
|
126
|
-
"tmux": 2,
|
|
127
|
-
"turbo": 2,
|
|
128
|
-
"ufw": 2,
|
|
129
|
-
"vault": 2,
|
|
130
|
-
"vault auth": 3,
|
|
131
|
-
"vault kv": 3,
|
|
132
|
-
"vercel": 2,
|
|
133
|
-
"volta": 2,
|
|
134
|
-
"wp": 2,
|
|
135
|
-
"yarn": 2,
|
|
136
|
-
"yarn dlx": 3,
|
|
137
|
-
"yarn run": 3
|
|
138
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"cat": 1,
|
|
3
|
+
"cd": 1,
|
|
4
|
+
"chmod": 1,
|
|
5
|
+
"chown": 1,
|
|
6
|
+
"cp": 1,
|
|
7
|
+
"echo": 1,
|
|
8
|
+
"env": 1,
|
|
9
|
+
"export": 1,
|
|
10
|
+
"grep": 1,
|
|
11
|
+
"kill": 1,
|
|
12
|
+
"killall": 1,
|
|
13
|
+
"ln": 1,
|
|
14
|
+
"ls": 1,
|
|
15
|
+
"mkdir": 1,
|
|
16
|
+
"mv": 1,
|
|
17
|
+
"ps": 1,
|
|
18
|
+
"pwd": 1,
|
|
19
|
+
"rm": 1,
|
|
20
|
+
"rmdir": 1,
|
|
21
|
+
"sleep": 1,
|
|
22
|
+
"source": 1,
|
|
23
|
+
"tail": 1,
|
|
24
|
+
"touch": 1,
|
|
25
|
+
"unset": 1,
|
|
26
|
+
"which": 1,
|
|
27
|
+
"aws": 3,
|
|
28
|
+
"az": 3,
|
|
29
|
+
"bazel": 2,
|
|
30
|
+
"brew": 2,
|
|
31
|
+
"bun": 2,
|
|
32
|
+
"bun run": 3,
|
|
33
|
+
"bun x": 3,
|
|
34
|
+
"cargo": 2,
|
|
35
|
+
"cargo add": 3,
|
|
36
|
+
"cargo run": 3,
|
|
37
|
+
"cdk": 2,
|
|
38
|
+
"cf": 2,
|
|
39
|
+
"cmake": 2,
|
|
40
|
+
"composer": 2,
|
|
41
|
+
"consul": 2,
|
|
42
|
+
"consul kv": 3,
|
|
43
|
+
"crictl": 2,
|
|
44
|
+
"deno": 2,
|
|
45
|
+
"deno task": 3,
|
|
46
|
+
"doctl": 3,
|
|
47
|
+
"docker": 2,
|
|
48
|
+
"docker builder": 3,
|
|
49
|
+
"docker compose": 3,
|
|
50
|
+
"docker container": 3,
|
|
51
|
+
"docker image": 3,
|
|
52
|
+
"docker network": 3,
|
|
53
|
+
"docker volume": 3,
|
|
54
|
+
"eksctl": 2,
|
|
55
|
+
"eksctl create": 3,
|
|
56
|
+
"firebase": 2,
|
|
57
|
+
"flyctl": 2,
|
|
58
|
+
"gcloud": 3,
|
|
59
|
+
"gh": 3,
|
|
60
|
+
"git": 2,
|
|
61
|
+
"git config": 3,
|
|
62
|
+
"git remote": 3,
|
|
63
|
+
"git stash": 3,
|
|
64
|
+
"go": 2,
|
|
65
|
+
"gradle": 2,
|
|
66
|
+
"helm": 2,
|
|
67
|
+
"heroku": 2,
|
|
68
|
+
"hugo": 2,
|
|
69
|
+
"ip": 2,
|
|
70
|
+
"ip addr": 3,
|
|
71
|
+
"ip link": 3,
|
|
72
|
+
"ip netns": 3,
|
|
73
|
+
"ip route": 3,
|
|
74
|
+
"kind": 2,
|
|
75
|
+
"kind create": 3,
|
|
76
|
+
"kubectl": 2,
|
|
77
|
+
"kubectl kustomize": 3,
|
|
78
|
+
"kubectl rollout": 3,
|
|
79
|
+
"kustomize": 2,
|
|
80
|
+
"make": 2,
|
|
81
|
+
"mc": 2,
|
|
82
|
+
"mc admin": 3,
|
|
83
|
+
"minikube": 2,
|
|
84
|
+
"mongosh": 2,
|
|
85
|
+
"mysql": 2,
|
|
86
|
+
"mvn": 2,
|
|
87
|
+
"ng": 2,
|
|
88
|
+
"npm": 2,
|
|
89
|
+
"npm exec": 3,
|
|
90
|
+
"npm init": 3,
|
|
91
|
+
"npm run": 3,
|
|
92
|
+
"npm view": 3,
|
|
93
|
+
"nvm": 2,
|
|
94
|
+
"nx": 2,
|
|
95
|
+
"openssl": 2,
|
|
96
|
+
"openssl req": 3,
|
|
97
|
+
"openssl x509": 3,
|
|
98
|
+
"pip": 2,
|
|
99
|
+
"pipenv": 2,
|
|
100
|
+
"pnpm": 2,
|
|
101
|
+
"pnpm dlx": 3,
|
|
102
|
+
"pnpm exec": 3,
|
|
103
|
+
"pnpm run": 3,
|
|
104
|
+
"poetry": 2,
|
|
105
|
+
"podman": 2,
|
|
106
|
+
"podman container": 3,
|
|
107
|
+
"podman image": 3,
|
|
108
|
+
"psql": 2,
|
|
109
|
+
"pulumi": 2,
|
|
110
|
+
"pulumi stack": 3,
|
|
111
|
+
"pyenv": 2,
|
|
112
|
+
"python": 2,
|
|
113
|
+
"rake": 2,
|
|
114
|
+
"rbenv": 2,
|
|
115
|
+
"redis-cli": 2,
|
|
116
|
+
"rustup": 2,
|
|
117
|
+
"serverless": 2,
|
|
118
|
+
"sfdx": 3,
|
|
119
|
+
"skaffold": 2,
|
|
120
|
+
"sls": 2,
|
|
121
|
+
"sst": 2,
|
|
122
|
+
"swift": 2,
|
|
123
|
+
"systemctl": 2,
|
|
124
|
+
"terraform": 2,
|
|
125
|
+
"terraform workspace": 3,
|
|
126
|
+
"tmux": 2,
|
|
127
|
+
"turbo": 2,
|
|
128
|
+
"ufw": 2,
|
|
129
|
+
"vault": 2,
|
|
130
|
+
"vault auth": 3,
|
|
131
|
+
"vault kv": 3,
|
|
132
|
+
"vercel": 2,
|
|
133
|
+
"volta": 2,
|
|
134
|
+
"wp": 2,
|
|
135
|
+
"yarn": 2,
|
|
136
|
+
"yarn dlx": 3,
|
|
137
|
+
"yarn run": 3
|
|
138
|
+
}
|
package/lib/arity.js
CHANGED
|
@@ -1,70 +1,70 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* How many words name a shell command, so "always allow" can be scoped to
|
|
3
|
-
* `npm run dev` or `git checkout` instead of every command there is.
|
|
4
|
-
*
|
|
5
|
-
* The ARITY table and the prefix() rule are from opencode
|
|
6
|
-
* (packages/opencode/src/permission/arity.ts), MIT License,
|
|
7
|
-
* Copyright (c) 2025 opencode - https://github.com/sst/opencode
|
|
8
|
-
* Command splitting and tokenizing below are Codeply's own.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
const ARITY = require('./arity-table.json');
|
|
12
|
-
|
|
13
|
-
// "Always allow node" would allow every script there is. For interpreters the
|
|
14
|
-
// script (or module) is part of the name: `node server.js`, `python app.py`.
|
|
15
|
-
const INTERPRETERS = new Set(['node', 'python', 'python3', 'py', 'deno', 'bun', 'ruby', 'php', 'perl', 'bash', 'sh', 'zsh', 'powershell', 'pwsh', 'cmd', 'tsx', 'ts-node']);
|
|
16
|
-
|
|
17
|
-
/** Longest listed prefix wins; unlisted commands are named by their first word. */
|
|
18
|
-
function prefix(tokens) {
|
|
19
|
-
if (tokens.length && INTERPRETERS.has(tokens[0]) && !ARITY[tokens.slice(0, 2).join(' ')]) return tokens.slice(0, 2);
|
|
20
|
-
for (let len = tokens.length; len > 0; len--) {
|
|
21
|
-
const arity = ARITY[tokens.slice(0, len).join(' ')];
|
|
22
|
-
if (arity !== undefined) return tokens.slice(0, arity);
|
|
23
|
-
}
|
|
24
|
-
return tokens.slice(0, 1);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/** Split a command line into its separate commands (&&, ||, ;, |, newlines). Quotes are respected. */
|
|
28
|
-
function splitCommands(line) {
|
|
29
|
-
const out = [];
|
|
30
|
-
let cur = '';
|
|
31
|
-
let quote = null;
|
|
32
|
-
for (let i = 0; i < line.length; i++) {
|
|
33
|
-
const c = line[i];
|
|
34
|
-
const n = line[i + 1];
|
|
35
|
-
if (quote) { cur += c; if (c === quote) quote = null; continue; }
|
|
36
|
-
if (c === '"' || c === "'") { quote = c; cur += c; continue; }
|
|
37
|
-
if ((c === '&' && n === '&') || (c === '|' && n === '|')) { out.push(cur); cur = ''; i++; continue; }
|
|
38
|
-
if (c === ';' || c === '|' || c === '\n' || c === '&') { out.push(cur); cur = ''; continue; }
|
|
39
|
-
cur += c;
|
|
40
|
-
}
|
|
41
|
-
out.push(cur);
|
|
42
|
-
return out.map((s) => s.trim()).filter(Boolean);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/** Words of one command, without leading VAR=value assignments or flags. */
|
|
46
|
-
function tokenize(cmd) {
|
|
47
|
-
const words = cmd.match(/"[^"]*"|'[^']*'|\S+/g) || [];
|
|
48
|
-
const clean = words.map((w) => w.replace(/^["']|["']$/g, ''));
|
|
49
|
-
let i = 0;
|
|
50
|
-
while (i < clean.length && /^[A-Za-z_][A-Za-z0-9_]*=/.test(clean[i])) i++;
|
|
51
|
-
const rest = clean.slice(i).filter((w) => !w.startsWith('-'));
|
|
52
|
-
// A path to a program is still that program: C:\tools\git.exe -> git
|
|
53
|
-
if (rest.length) rest[0] = rest[0].split(/[\\/]/).pop().replace(/\.(exe|cmd|bat|ps1)$/i, '').toLowerCase();
|
|
54
|
-
return rest;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* The permission patterns a command line needs, one per command in it:
|
|
59
|
-
* 'npm run dev && git status' -> ['npm run dev', 'git status']
|
|
60
|
-
* Subshells, backticks and redirections into files return null: too dynamic
|
|
61
|
-
* (or too destructive) to approve by name alone.
|
|
62
|
-
*/
|
|
63
|
-
function commandPatterns(line) {
|
|
64
|
-
const text = String(line || '');
|
|
65
|
-
if (/\$\(|`|>/.test(text)) return null;
|
|
66
|
-
const pats = splitCommands(text).map((c) => prefix(tokenize(c)).join(' ')).filter(Boolean);
|
|
67
|
-
return pats.length ? [...new Set(pats)] : null;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
module.exports = { commandPatterns, prefix, tokenize, splitCommands };
|
|
1
|
+
/**
|
|
2
|
+
* How many words name a shell command, so "always allow" can be scoped to
|
|
3
|
+
* `npm run dev` or `git checkout` instead of every command there is.
|
|
4
|
+
*
|
|
5
|
+
* The ARITY table and the prefix() rule are from opencode
|
|
6
|
+
* (packages/opencode/src/permission/arity.ts), MIT License,
|
|
7
|
+
* Copyright (c) 2025 opencode - https://github.com/sst/opencode
|
|
8
|
+
* Command splitting and tokenizing below are Codeply's own.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
const ARITY = require('./arity-table.json');
|
|
12
|
+
|
|
13
|
+
// "Always allow node" would allow every script there is. For interpreters the
|
|
14
|
+
// script (or module) is part of the name: `node server.js`, `python app.py`.
|
|
15
|
+
const INTERPRETERS = new Set(['node', 'python', 'python3', 'py', 'deno', 'bun', 'ruby', 'php', 'perl', 'bash', 'sh', 'zsh', 'powershell', 'pwsh', 'cmd', 'tsx', 'ts-node']);
|
|
16
|
+
|
|
17
|
+
/** Longest listed prefix wins; unlisted commands are named by their first word. */
|
|
18
|
+
function prefix(tokens) {
|
|
19
|
+
if (tokens.length && INTERPRETERS.has(tokens[0]) && !ARITY[tokens.slice(0, 2).join(' ')]) return tokens.slice(0, 2);
|
|
20
|
+
for (let len = tokens.length; len > 0; len--) {
|
|
21
|
+
const arity = ARITY[tokens.slice(0, len).join(' ')];
|
|
22
|
+
if (arity !== undefined) return tokens.slice(0, arity);
|
|
23
|
+
}
|
|
24
|
+
return tokens.slice(0, 1);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** Split a command line into its separate commands (&&, ||, ;, |, newlines). Quotes are respected. */
|
|
28
|
+
function splitCommands(line) {
|
|
29
|
+
const out = [];
|
|
30
|
+
let cur = '';
|
|
31
|
+
let quote = null;
|
|
32
|
+
for (let i = 0; i < line.length; i++) {
|
|
33
|
+
const c = line[i];
|
|
34
|
+
const n = line[i + 1];
|
|
35
|
+
if (quote) { cur += c; if (c === quote) quote = null; continue; }
|
|
36
|
+
if (c === '"' || c === "'") { quote = c; cur += c; continue; }
|
|
37
|
+
if ((c === '&' && n === '&') || (c === '|' && n === '|')) { out.push(cur); cur = ''; i++; continue; }
|
|
38
|
+
if (c === ';' || c === '|' || c === '\n' || c === '&') { out.push(cur); cur = ''; continue; }
|
|
39
|
+
cur += c;
|
|
40
|
+
}
|
|
41
|
+
out.push(cur);
|
|
42
|
+
return out.map((s) => s.trim()).filter(Boolean);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** Words of one command, without leading VAR=value assignments or flags. */
|
|
46
|
+
function tokenize(cmd) {
|
|
47
|
+
const words = cmd.match(/"[^"]*"|'[^']*'|\S+/g) || [];
|
|
48
|
+
const clean = words.map((w) => w.replace(/^["']|["']$/g, ''));
|
|
49
|
+
let i = 0;
|
|
50
|
+
while (i < clean.length && /^[A-Za-z_][A-Za-z0-9_]*=/.test(clean[i])) i++;
|
|
51
|
+
const rest = clean.slice(i).filter((w) => !w.startsWith('-'));
|
|
52
|
+
// A path to a program is still that program: C:\tools\git.exe -> git
|
|
53
|
+
if (rest.length) rest[0] = rest[0].split(/[\\/]/).pop().replace(/\.(exe|cmd|bat|ps1)$/i, '').toLowerCase();
|
|
54
|
+
return rest;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* The permission patterns a command line needs, one per command in it:
|
|
59
|
+
* 'npm run dev && git status' -> ['npm run dev', 'git status']
|
|
60
|
+
* Subshells, backticks and redirections into files return null: too dynamic
|
|
61
|
+
* (or too destructive) to approve by name alone.
|
|
62
|
+
*/
|
|
63
|
+
function commandPatterns(line) {
|
|
64
|
+
const text = String(line || '');
|
|
65
|
+
if (/\$\(|`|>/.test(text)) return null;
|
|
66
|
+
const pats = splitCommands(text).map((c) => prefix(tokenize(c)).join(' ')).filter(Boolean);
|
|
67
|
+
return pats.length ? [...new Set(pats)] : null;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
module.exports = { commandPatterns, prefix, tokenize, splitCommands };
|
package/lib/auth.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { createRequire } from 'module';
|
|
2
|
-
const require = createRequire(import.meta.url);
|
|
3
|
-
|
|
4
|
-
const auth = require('./auth.js');
|
|
5
|
-
export default auth;
|
|
6
|
-
export const { SUPABASE_URL, SUPABASE_ANON_KEY, getClient, login, logout, getSession, getAccessToken } = auth;
|
|
1
|
+
import { createRequire } from 'module';
|
|
2
|
+
const require = createRequire(import.meta.url);
|
|
3
|
+
|
|
4
|
+
const auth = require('./auth.js');
|
|
5
|
+
export default auth;
|
|
6
|
+
export const { SUPABASE_URL, SUPABASE_ANON_KEY, getClient, login, logout, getSession, getAccessToken } = auth;
|
package/lib/autopilot.js
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The autonomy loop's rules: what a bot may do with nobody watching.
|
|
3
|
+
*
|
|
4
|
+
* A task reaches a bot from the user (a chat, a call, their own email to the
|
|
5
|
+
* bot, a Slack DM to the bot). The host (Craft's autopilot.js) runs it as the
|
|
6
|
+
* bot's agent, then a checking turn, then reports back where it came from.
|
|
7
|
+
* Every action the agent wants to take goes through decide():
|
|
8
|
+
*
|
|
9
|
+
* run go ahead (inside the bot's approval boundary, or allowed by its
|
|
10
|
+
* autonomy level, within its daily budget)
|
|
11
|
+
* hold put it in the outbox for the bot's hold time; the user can cancel
|
|
12
|
+
* from Crew or the phone; then it goes by itself
|
|
13
|
+
* ask wait for the user (in the outbox, with no timer)
|
|
14
|
+
* refuse not at all: the bot is set to suggest only (autonomy level none),
|
|
15
|
+
* so it drafts and says what it would do instead
|
|
16
|
+
*
|
|
17
|
+
* Always ask, at every level: anything the engine flags dangerous, deleting
|
|
18
|
+
* a cloud project, anything when the request did not come from the user, and
|
|
19
|
+
* everything while the user has stopped all bots.
|
|
20
|
+
*/
|
|
21
|
+
const bots = require('./bots.js');
|
|
22
|
+
|
|
23
|
+
const OUTWARD = new Set(['send', 'publish', 'databases', 'calendar']);
|
|
24
|
+
const NEVER_ALONE = new Set(['supabase_delete_project', 'add_model']);
|
|
25
|
+
// Which daily budget a category spends (bots.js normalizeAutonomy budgets).
|
|
26
|
+
const BUDGET_OF = { send: 'emails', publish: 'deploys' };
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* req: the engine's approval request ({ tool, danger, ... }).
|
|
30
|
+
* o: { requester: 'user'|'other', paused, budgetLeft(key) -> number }
|
|
31
|
+
*/
|
|
32
|
+
function decide(req, bot, o = {}) {
|
|
33
|
+
const tool = String(req && req.tool || '');
|
|
34
|
+
if (!bot || o.paused) return 'ask';
|
|
35
|
+
if (bots.suggestOnly(bot, tool)) return 'refuse';
|
|
36
|
+
if (req.danger || NEVER_ALONE.has(tool)) return 'ask';
|
|
37
|
+
if (o.requester && o.requester !== 'user') return 'ask';
|
|
38
|
+
const cat = bots.approvalCategory(tool);
|
|
39
|
+
const budget = cat && BUDGET_OF[cat];
|
|
40
|
+
const within = !budget || typeof o.budgetLeft !== 'function' || o.budgetLeft(budget) > 0;
|
|
41
|
+
const a = bots.normalizeAutonomy(bot.autonomy);
|
|
42
|
+
// Inside the bot's own approval boundary: what it never had to ask about.
|
|
43
|
+
if (!cat || bots.canSkipApproval(bot, tool)) return within ? 'run' : 'ask';
|
|
44
|
+
if (a.level === 'full') return a.allow.includes(cat) && within ? 'run' : 'ask';
|
|
45
|
+
if (a.level === 'hold') {
|
|
46
|
+
if (OUTWARD.has(cat)) return within ? 'hold' : 'ask';
|
|
47
|
+
return a.allow.includes(cat) ? 'run' : 'ask';
|
|
48
|
+
}
|
|
49
|
+
return 'ask';
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const SOURCE_NAME = { handoff: 'another bot handing work on', crew: 'a chat in Crew', call: 'a phone call', email: 'an email from the user', slack: 'Slack', phone: 'the phone app', nudge: 'a nudge' };
|
|
53
|
+
|
|
54
|
+
/** The first turn: the task, how it came in, and how to work without the user there. */
|
|
55
|
+
function taskMessage(task, { holdMinutes } = {}) {
|
|
56
|
+
return `TASK (from ${SOURCE_NAME[task.source] || task.source}, while the user is away)
|
|
57
|
+
${String(task.text || '').trim()}
|
|
58
|
+
|
|
59
|
+
Work this end to end on your own: plan it with the todo tool, do it, and check it really worked. The user is not watching, so do not stop to ask questions you can answer yourself; when something truly needs them (a password, a choice only they can make, money), say exactly what in one line and do everything else.
|
|
60
|
+
Actions that send, publish, deploy or change a database may wait in the user's outbox${holdMinutes ? ` for ${holdMinutes} minutes` : ''} or need their OK: that is expected; carry on with the rest.`;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** The checking turn: look at the real result, fix what is missing, end with a verdict line. */
|
|
64
|
+
function verifyMessage(task) {
|
|
65
|
+
return `Now check the task really worked: "${String(task.text || '').slice(0, 400)}"
|
|
66
|
+
Look at the actual result, not your memory of it: read what changed, run the check, test or build that applies, open any page you published (browser_check), confirm an email or message has an id. Fix anything missing and check again.
|
|
67
|
+
End with ONE line, exactly: VERIFIED: yes|partly|no - <how you checked, or what is missing>`;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function parseVerdict(text) {
|
|
71
|
+
const m = /VERIFIED:\s*(yes|partly|no)\b\s*[-:,]?\s*(.*)$/im.exec(String(text || ''));
|
|
72
|
+
if (!m) return { verified: 'unknown', why: '' };
|
|
73
|
+
return { verified: m[1].toLowerCase(), why: m[2].trim().slice(0, 300) };
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/** The short report the user gets (push, email or Slack). */
|
|
77
|
+
function reportText(task, { reply, verdict, status }) {
|
|
78
|
+
const body = String(reply || '').replace(/VERIFIED:.*$/im, '').replace(/\s+/g, ' ').trim();
|
|
79
|
+
const head = status === 'done' ? (verdict.verified === 'yes' ? 'Done and checked' : verdict.verified === 'partly' ? 'Mostly done' : 'Done') : status === 'needs_you' ? 'Needs you' : 'Could not finish';
|
|
80
|
+
const why = verdict.why ? ` (${verdict.why})` : '';
|
|
81
|
+
return `${head}${why}: ${body.slice(0, 600) || String(task.text || '').slice(0, 120)}`;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
module.exports = { OUTWARD, NEVER_ALONE, BUDGET_OF, decide, taskMessage, verifyMessage, parseVerdict, reportText };
|
package/lib/bot-mail.js
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A bot's own email (shella@codeply.app): the engine side of bot_email_send.
|
|
3
|
+
*
|
|
4
|
+
* The engine only knows the tool. The host (Craft's bots-mail.js) registers
|
|
5
|
+
* the handler, since it holds the Codeply sign-in that the bot-mail function
|
|
6
|
+
* needs; the Resend key never leaves Codeply's server. With no handler (the
|
|
7
|
+
* plain CLI) the tool is not offered.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
let handler = null;
|
|
11
|
+
|
|
12
|
+
/** h: { send({ botId, to, subject, text, replyTo }), thread(id) } each resolving to { ok, ... } */
|
|
13
|
+
function setHandler(h) { handler = h && typeof h.send === 'function' ? h : null; }
|
|
14
|
+
function available() { return !!handler; }
|
|
15
|
+
|
|
16
|
+
/** The bot's address, or '' (the bot file is the truth: bots.js normalizeEmail). */
|
|
17
|
+
function addressOf(botId) {
|
|
18
|
+
if (!botId) return '';
|
|
19
|
+
try { const b = require('./bots.js').getBot(botId); return (b && b.email && b.email.on && b.email.address) || ''; } catch { return ''; }
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** What a reply to a received bot email needs: who, the subject, and the thread headers. */
|
|
23
|
+
async function threadOf(id) {
|
|
24
|
+
if (!handler || typeof handler.thread !== 'function' || !id) return null;
|
|
25
|
+
try { return await handler.thread(String(id)); } catch { return null; }
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
async function send(o) {
|
|
29
|
+
if (!handler) return { ok: false, output: 'Bot email is only available in the Craft app.' };
|
|
30
|
+
return handler.send(o);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const RULES = (address, native) => `YOUR OWN EMAIL
|
|
34
|
+
You have your own address: ${address}. Use bot_email_send to email as yourself; every email you send ends with a line saying you are the user's AI assistant, and replies come back to you. Use gmail_send only when the user wants mail to come from their own Gmail. Never sign as the user or write as if you were them. The user's whole crew shares 50 emails a month and 10 a day (sent and received together), so write only when it matters.${native ? '' : `
|
|
35
|
+
|
|
36
|
+
To email as yourself, write:
|
|
37
|
+
<codeply:bot_email_send>
|
|
38
|
+
<to>someone@example.com</to>
|
|
39
|
+
<subject>Friday</subject>
|
|
40
|
+
<body>
|
|
41
|
+
Hi Sara, ...
|
|
42
|
+
</body>
|
|
43
|
+
<reply_to>(optional: the id of the email you are answering)</reply_to>
|
|
44
|
+
</codeply:bot_email_send>`}`;
|
|
45
|
+
|
|
46
|
+
module.exports = { setHandler, available, addressOf, threadOf, send, RULES };
|