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.
Files changed (429) hide show
  1. package/LICENSE +21 -21
  2. package/THIRD_PARTY_NOTICES.md +65 -65
  3. package/bin/codeply.js +8 -3
  4. package/lib/agent.mjs +2596 -2268
  5. package/lib/ai.js +135 -27
  6. package/lib/ai.mjs +6 -6
  7. package/lib/apply-patch.js +217 -217
  8. package/lib/arity-table.json +138 -138
  9. package/lib/arity.js +70 -70
  10. package/lib/auth.mjs +6 -6
  11. package/lib/autopilot.js +84 -0
  12. package/lib/bot-mail.js +46 -0
  13. package/lib/bots.js +142 -15
  14. package/lib/brain.js +914 -0
  15. package/lib/call-assist.js +120 -0
  16. package/lib/chatgpt.js +282 -282
  17. package/lib/cloud-browser.mjs +143 -143
  18. package/lib/cloud.mjs +1396 -1320
  19. package/lib/commands.js +103 -103
  20. package/lib/computer.js +136 -0
  21. package/lib/design-library/assemble-artifact.mjs +21 -21
  22. package/lib/design-library/cleanup.mjs +45 -45
  23. package/lib/design-library/index.json +22379 -22379
  24. package/lib/design-library/make-table-data.mjs +39 -39
  25. package/lib/design-tools.mjs +173 -0
  26. package/lib/diagnostics.js +192 -192
  27. package/lib/dsh-acp.mjs +444 -0
  28. package/lib/edit-engine.js +364 -364
  29. package/lib/github-agent.mjs +326 -326
  30. package/lib/handoff.mjs +245 -0
  31. package/lib/history.js +78 -75
  32. package/lib/life-sources.js +319 -0
  33. package/lib/life-store.js +356 -0
  34. package/lib/life-triggers.js +286 -0
  35. package/lib/life.js +487 -0
  36. package/lib/mail-watch.js +3 -3
  37. package/lib/mcp.js +258 -258
  38. package/lib/native-tools.mjs +17 -5
  39. package/lib/oauth-connectors.js +76 -21
  40. package/lib/permissions.js +109 -109
  41. package/lib/plugins.js +356 -353
  42. package/lib/reach.js +67 -67
  43. package/lib/render-md.mjs +647 -617
  44. package/lib/screen.js +77 -0
  45. package/lib/server.mjs +458 -457
  46. package/lib/session-db.js +220 -220
  47. package/lib/share.js +208 -168
  48. package/lib/skills.js +4 -1
  49. package/lib/snapshot.js +146 -146
  50. package/lib/subagents.js +4 -2
  51. package/lib/telemetry.js +105 -105
  52. package/lib/terminal-hints.js +154 -154
  53. package/lib/textarea.mjs +264 -258
  54. package/lib/tools.mjs +326 -40
  55. package/lib/tui.mjs +1459 -1086
  56. package/lib/typecheck-worker.js +147 -147
  57. package/lib/web-tools.js +209 -209
  58. package/package.json +1 -1
  59. package/skills/SOURCE.md +58 -58
  60. package/skills/accessibility/SKILL.md +147 -147
  61. package/skills/agent-architecture-audit/SKILL.md +257 -257
  62. package/skills/agent-eval/SKILL.md +147 -147
  63. package/skills/agent-harness-construction/SKILL.md +74 -74
  64. package/skills/agent-introspection-debugging/SKILL.md +154 -154
  65. package/skills/agent-payment-x402/SKILL.md +225 -225
  66. package/skills/agent-self-evaluation/SKILL.md +182 -182
  67. package/skills/agent-self-evaluation/references/evaluation-criteria.md +71 -71
  68. package/skills/agent-self-evaluation/references/hook-integration.md +64 -64
  69. package/skills/agent-sort/SKILL.md +216 -216
  70. package/skills/agentic-engineering/SKILL.md +64 -64
  71. package/skills/agentic-os/SKILL.md +388 -388
  72. package/skills/ai-first-engineering/SKILL.md +52 -52
  73. package/skills/ai-regression-testing/SKILL.md +386 -386
  74. package/skills/android-clean-architecture/SKILL.md +340 -340
  75. package/skills/angular-developer/SKILL.md +155 -155
  76. package/skills/angular-developer/references/angular-animations.md +160 -160
  77. package/skills/angular-developer/references/angular-aria.md +410 -410
  78. package/skills/angular-developer/references/cli.md +86 -86
  79. package/skills/angular-developer/references/component-harnesses.md +59 -59
  80. package/skills/angular-developer/references/component-styling.md +91 -91
  81. package/skills/angular-developer/references/components.md +117 -117
  82. package/skills/angular-developer/references/creating-services.md +97 -97
  83. package/skills/angular-developer/references/data-resolvers.md +69 -69
  84. package/skills/angular-developer/references/define-routes.md +67 -67
  85. package/skills/angular-developer/references/defining-providers.md +72 -72
  86. package/skills/angular-developer/references/di-fundamentals.md +120 -120
  87. package/skills/angular-developer/references/e2e-testing.md +56 -56
  88. package/skills/angular-developer/references/effects.md +83 -83
  89. package/skills/angular-developer/references/hierarchical-injectors.md +43 -43
  90. package/skills/angular-developer/references/host-elements.md +80 -80
  91. package/skills/angular-developer/references/injection-context.md +63 -63
  92. package/skills/angular-developer/references/inputs.md +101 -101
  93. package/skills/angular-developer/references/linked-signal.md +59 -59
  94. package/skills/angular-developer/references/loading-strategies.md +61 -61
  95. package/skills/angular-developer/references/mcp.md +108 -108
  96. package/skills/angular-developer/references/navigate-to-routes.md +69 -69
  97. package/skills/angular-developer/references/outputs.md +86 -86
  98. package/skills/angular-developer/references/reactive-forms.md +122 -122
  99. package/skills/angular-developer/references/rendering-strategies.md +44 -44
  100. package/skills/angular-developer/references/resource.md +77 -77
  101. package/skills/angular-developer/references/route-animations.md +56 -56
  102. package/skills/angular-developer/references/route-guards.md +52 -52
  103. package/skills/angular-developer/references/router-lifecycle.md +45 -45
  104. package/skills/angular-developer/references/router-testing.md +87 -87
  105. package/skills/angular-developer/references/show-routes-with-outlets.md +68 -68
  106. package/skills/angular-developer/references/signal-forms.md +795 -795
  107. package/skills/angular-developer/references/signals-overview.md +94 -94
  108. package/skills/angular-developer/references/tailwind-css.md +69 -69
  109. package/skills/angular-developer/references/template-driven-forms.md +114 -114
  110. package/skills/angular-developer/references/testing-fundamentals.md +65 -65
  111. package/skills/api-connector-builder/SKILL.md +121 -121
  112. package/skills/api-design/SKILL.md +524 -524
  113. package/skills/architecture-decision-records/SKILL.md +180 -180
  114. package/skills/article-writing/SKILL.md +80 -80
  115. package/skills/automation-audit-ops/SKILL.md +143 -143
  116. package/skills/autonomous-agent-harness/SKILL.md +274 -274
  117. package/skills/autonomous-loops/SKILL.md +611 -611
  118. package/skills/backend-patterns/SKILL.md +562 -562
  119. package/skills/benchmark/SKILL.md +95 -95
  120. package/skills/benchmark-methodology/SKILL.md +191 -191
  121. package/skills/benchmark-optimization-loop/SKILL.md +71 -71
  122. package/skills/blender-motion-state-inspection/SKILL.md +165 -165
  123. package/skills/blueprint/SKILL.md +106 -106
  124. package/skills/brand-discovery/SKILL.md +145 -145
  125. package/skills/brand-discovery/references/10_purpose-why.md +40 -40
  126. package/skills/brand-discovery/references/20_positioning.md +44 -44
  127. package/skills/brand-discovery/references/30_audience-niche.md +52 -52
  128. package/skills/brand-discovery/references/40_personality-archetype.md +57 -57
  129. package/skills/brand-discovery/references/50_voice-tone.md +59 -59
  130. package/skills/brand-discovery/references/60_narrative-story.md +50 -50
  131. package/skills/brand-discovery/references/70_founder-tension.md +49 -49
  132. package/skills/brand-discovery/references/90_SYNTHESIS.md +133 -133
  133. package/skills/brand-voice/SKILL.md +98 -98
  134. package/skills/brand-voice/references/voice-profile-schema.md +55 -55
  135. package/skills/browser-qa/SKILL.md +105 -105
  136. package/skills/bun-runtime/SKILL.md +85 -85
  137. package/skills/canary-watch/SKILL.md +108 -108
  138. package/skills/carrier-relationship-management/SKILL.md +212 -212
  139. package/skills/cisco-ios-patterns/SKILL.md +164 -164
  140. package/skills/ck/SKILL.md +148 -148
  141. package/skills/claude-devfleet/SKILL.md +112 -112
  142. package/skills/click-path-audit/SKILL.md +245 -245
  143. package/skills/clickhouse-io/SKILL.md +445 -445
  144. package/skills/code-tour/SKILL.md +254 -254
  145. package/skills/codebase-onboarding/SKILL.md +234 -234
  146. package/skills/codehealth-mcp/SKILL.md +167 -167
  147. package/skills/codeply-taste/LICENSE +21 -0
  148. package/skills/codeply-taste/SKILL.md +100 -0
  149. package/skills/codeply-taste/SOURCE.md +10 -0
  150. package/skills/codeply-taste/assets/base.css +100 -0
  151. package/skills/codeply-taste/assets/base.js +37 -0
  152. package/skills/codeply-taste/library/directions.json +1078 -0
  153. package/skills/codeply-taste/library/heroes.json +894 -0
  154. package/skills/codeply-taste/library/motions.json +57 -0
  155. package/skills/codeply-taste/library/palettes.json +1485 -0
  156. package/skills/codeply-taste/library/photos.json +7240 -0
  157. package/skills/codeply-taste/library/sections.json +4136 -0
  158. package/skills/codeply-taste/library/sites.json +7274 -0
  159. package/skills/codeply-taste/library/type.json +2024 -0
  160. package/skills/codeply-taste/references/colour.md +141 -0
  161. package/skills/codeply-taste/references/copy.md +177 -0
  162. package/skills/codeply-taste/references/critique.md +171 -0
  163. package/skills/codeply-taste/references/imagery.md +377 -0
  164. package/skills/codeply-taste/references/layout.md +178 -0
  165. package/skills/codeply-taste/references/motion.md +292 -0
  166. package/skills/codeply-taste/references/research.md +306 -0
  167. package/skills/codeply-taste/references/tells.md +115 -0
  168. package/skills/codeply-taste/references/type.md +170 -0
  169. package/skills/codeply-taste/scripts/assets.mjs +865 -0
  170. package/skills/codeply-taste/scripts/draw.mjs +525 -0
  171. package/skills/codeply-taste/scripts/inspect.mjs +205 -0
  172. package/skills/codeply-taste/scripts/lib/cdp.mjs +205 -0
  173. package/skills/codeply-taste/scripts/lib/probe.mjs +569 -0
  174. package/skills/codeply-taste/scripts/lib/rules.mjs +137 -0
  175. package/skills/codeply-taste/scripts/lint.mjs +108 -0
  176. package/skills/coding-standards/SKILL.md +551 -551
  177. package/skills/competitive-platform-analysis/SKILL.md +214 -214
  178. package/skills/competitive-report-structure/SKILL.md +162 -162
  179. package/skills/compose-multiplatform-patterns/SKILL.md +300 -300
  180. package/skills/config-gc/SKILL.md +120 -120
  181. package/skills/configure-ecc/SKILL.md +385 -385
  182. package/skills/connections-optimizer/SKILL.md +190 -190
  183. package/skills/content-engine/SKILL.md +132 -132
  184. package/skills/content-hash-cache-pattern/SKILL.md +162 -162
  185. package/skills/context-budget/SKILL.md +136 -136
  186. package/skills/continuous-agent-loop/SKILL.md +46 -46
  187. package/skills/continuous-learning/SKILL.md +132 -132
  188. package/skills/continuous-learning-v2/SKILL.md +361 -361
  189. package/skills/contract-first/SKILL.md +287 -287
  190. package/skills/cost-aware-llm-pipeline/SKILL.md +184 -184
  191. package/skills/cost-tracking/SKILL.md +97 -97
  192. package/skills/council/SKILL.md +204 -204
  193. package/skills/cpp-coding-standards/SKILL.md +724 -724
  194. package/skills/cpp-testing/SKILL.md +325 -325
  195. package/skills/crosspost/SKILL.md +112 -112
  196. package/skills/csharp-testing/SKILL.md +322 -322
  197. package/skills/customer-billing-ops/SKILL.md +141 -141
  198. package/skills/customs-trade-compliance/SKILL.md +263 -263
  199. package/skills/dart-flutter-patterns/SKILL.md +564 -564
  200. package/skills/dashboard-builder/SKILL.md +109 -109
  201. package/skills/data-scraper-agent/SKILL.md +765 -765
  202. package/skills/data-throughput-accelerator/SKILL.md +74 -74
  203. package/skills/database-migrations/SKILL.md +430 -430
  204. package/skills/deep-research/SKILL.md +160 -160
  205. package/skills/defi-amm-security/SKILL.md +167 -167
  206. package/skills/delivery-gate/SKILL.md +126 -126
  207. package/skills/deployment-patterns/SKILL.md +428 -428
  208. package/skills/design-system/SKILL.md +83 -83
  209. package/skills/django-celery/SKILL.md +458 -458
  210. package/skills/django-patterns/SKILL.md +735 -735
  211. package/skills/django-security/SKILL.md +644 -644
  212. package/skills/django-tdd/SKILL.md +730 -730
  213. package/skills/django-verification/SKILL.md +470 -470
  214. package/skills/dmux-workflows/SKILL.md +192 -192
  215. package/skills/docker-patterns/SKILL.md +365 -365
  216. package/skills/documentation-lookup/SKILL.md +91 -91
  217. package/skills/dotnet-patterns/SKILL.md +322 -322
  218. package/skills/dynamic-workflow-mode/SKILL.md +124 -124
  219. package/skills/e2e-testing/SKILL.md +327 -327
  220. package/skills/ecc-guide/SKILL.md +190 -190
  221. package/skills/ecc-recipes/SKILL.md +149 -149
  222. package/skills/ecc-tools-cost-audit/SKILL.md +161 -161
  223. package/skills/email-ops/SKILL.md +122 -122
  224. package/skills/energy-procurement/SKILL.md +228 -228
  225. package/skills/enterprise-agent-ops/SKILL.md +51 -51
  226. package/skills/error-handling/SKILL.md +377 -377
  227. package/skills/eval-harness/SKILL.md +271 -271
  228. package/skills/evm-token-decimals/SKILL.md +131 -131
  229. package/skills/exa-search/SKILL.md +108 -108
  230. package/skills/fal-ai-media/SKILL.md +289 -289
  231. package/skills/fastapi-patterns/SKILL.md +514 -514
  232. package/skills/finance-billing-ops/SKILL.md +128 -128
  233. package/skills/flox-environments/SKILL.md +497 -497
  234. package/skills/flutter-dart-code-review/SKILL.md +436 -436
  235. package/skills/foundation-models-on-device/SKILL.md +243 -243
  236. package/skills/frontend-a11y/SKILL.md +446 -446
  237. package/skills/frontend-design-direction/SKILL.md +93 -93
  238. package/skills/frontend-patterns/SKILL.md +657 -657
  239. package/skills/frontend-slides/SKILL.md +185 -185
  240. package/skills/fsharp-testing/SKILL.md +281 -281
  241. package/skills/gan-style-harness/SKILL.md +279 -279
  242. package/skills/gateguard/SKILL.md +133 -133
  243. package/skills/generating-python-installer/SKILL.md +820 -820
  244. package/skills/git-workflow/SKILL.md +716 -716
  245. package/skills/github-ops/SKILL.md +145 -145
  246. package/skills/golang-patterns/SKILL.md +676 -676
  247. package/skills/golang-testing/SKILL.md +721 -721
  248. package/skills/google-workspace-ops/SKILL.md +96 -96
  249. package/skills/growth-log/SKILL.md +128 -128
  250. package/skills/healthcare-cdss-patterns/SKILL.md +246 -246
  251. package/skills/healthcare-emr-patterns/SKILL.md +160 -160
  252. package/skills/healthcare-eval-harness/SKILL.md +208 -208
  253. package/skills/healthcare-phi-compliance/SKILL.md +146 -146
  254. package/skills/hermes-imports/SKILL.md +89 -89
  255. package/skills/hexagonal-architecture/SKILL.md +277 -277
  256. package/skills/hipaa-compliance/SKILL.md +79 -79
  257. package/skills/homelab-network-readiness/SKILL.md +170 -170
  258. package/skills/homelab-network-setup/SKILL.md +130 -130
  259. package/skills/homelab-pihole-dns/SKILL.md +275 -275
  260. package/skills/homelab-vlan-segmentation/SKILL.md +312 -312
  261. package/skills/homelab-wireguard-vpn/SKILL.md +306 -306
  262. package/skills/hookify-rules/SKILL.md +128 -128
  263. package/skills/inherit-legacy-style/SKILL.md +157 -157
  264. package/skills/intent-driven-development/SKILL.md +360 -360
  265. package/skills/inventory-demand-planning/SKILL.md +247 -247
  266. package/skills/investor-materials/SKILL.md +97 -97
  267. package/skills/investor-outreach/SKILL.md +92 -92
  268. package/skills/ios-icon-gen/SKILL.md +158 -158
  269. package/skills/iterative-retrieval/SKILL.md +212 -212
  270. package/skills/ito-basket-compare/SKILL.md +64 -64
  271. package/skills/ito-compute/SKILL.md +129 -129
  272. package/skills/ito-data-atlas-agent/SKILL.md +64 -64
  273. package/skills/ito-market-intelligence/SKILL.md +61 -61
  274. package/skills/ito-trade-planner/SKILL.md +68 -68
  275. package/skills/java-coding-standards/SKILL.md +384 -384
  276. package/skills/jira-integration/SKILL.md +303 -303
  277. package/skills/jpa-patterns/SKILL.md +152 -152
  278. package/skills/knowledge-ops/SKILL.md +155 -155
  279. package/skills/kotlin-coroutines-flows/SKILL.md +285 -285
  280. package/skills/kotlin-exposed-patterns/SKILL.md +720 -720
  281. package/skills/kotlin-ktor-patterns/SKILL.md +690 -690
  282. package/skills/kotlin-patterns/SKILL.md +712 -712
  283. package/skills/kotlin-testing/SKILL.md +825 -825
  284. package/skills/kubernetes-patterns/SKILL.md +756 -756
  285. package/skills/laravel-patterns/SKILL.md +416 -416
  286. package/skills/laravel-plugin-discovery/SKILL.md +230 -230
  287. package/skills/laravel-security/SKILL.md +948 -948
  288. package/skills/laravel-tdd/SKILL.md +675 -675
  289. package/skills/laravel-verification/SKILL.md +180 -180
  290. package/skills/latency-critical-systems/SKILL.md +75 -75
  291. package/skills/lead-intelligence/SKILL.md +322 -322
  292. package/skills/liquid-glass-design/SKILL.md +279 -279
  293. package/skills/llm-trading-agent-security/SKILL.md +147 -147
  294. package/skills/logistics-exception-management/SKILL.md +222 -222
  295. package/skills/loop-design-check/SKILL.md +143 -143
  296. package/skills/mailtrap-email-integration/SKILL.md +77 -77
  297. package/skills/make-interfaces-feel-better/SKILL.md +152 -152
  298. package/skills/manim-video/SKILL.md +90 -90
  299. package/skills/market-research/SKILL.md +76 -76
  300. package/skills/marketing-campaign/SKILL.md +114 -114
  301. package/skills/mcp-server-patterns/SKILL.md +70 -70
  302. package/skills/messages-ops/SKILL.md +105 -105
  303. package/skills/ml-adoption-playbook/SKILL.md +57 -57
  304. package/skills/mle-workflow/SKILL.md +348 -348
  305. package/skills/motion-advanced/SKILL.md +596 -596
  306. package/skills/motion-foundations/SKILL.md +299 -299
  307. package/skills/motion-patterns/SKILL.md +434 -434
  308. package/skills/motion-ui/SKILL.md +576 -576
  309. package/skills/mysql-patterns/SKILL.md +413 -413
  310. package/skills/nanoclaw-repl/SKILL.md +34 -34
  311. package/skills/nestjs-patterns/SKILL.md +231 -231
  312. package/skills/netmiko-ssh-automation/SKILL.md +174 -174
  313. package/skills/network-bgp-diagnostics/SKILL.md +168 -168
  314. package/skills/network-config-validation/SKILL.md +211 -211
  315. package/skills/network-interface-health/SKILL.md +153 -153
  316. package/skills/nextjs-turbopack/SKILL.md +58 -58
  317. package/skills/nodejs-keccak256/SKILL.md +103 -103
  318. package/skills/nutrient-document-processing/SKILL.md +168 -168
  319. package/skills/nuxt4-patterns/SKILL.md +101 -101
  320. package/skills/openclaw-persona-forge/SKILL.md +289 -289
  321. package/skills/openclaw-persona-forge/references/avatar-style.md +124 -124
  322. package/skills/openclaw-persona-forge/references/boundary-rules.md +53 -53
  323. package/skills/openclaw-persona-forge/references/error-handling.md +53 -53
  324. package/skills/openclaw-persona-forge/references/identity-tension.md +48 -48
  325. package/skills/openclaw-persona-forge/references/naming-system.md +39 -39
  326. package/skills/openclaw-persona-forge/references/output-template.md +166 -166
  327. package/skills/opensource-pipeline/SKILL.md +256 -256
  328. package/skills/orch-add-feature/SKILL.md +45 -45
  329. package/skills/orch-build-mvp/SKILL.md +49 -49
  330. package/skills/orch-change-feature/SKILL.md +43 -43
  331. package/skills/orch-fix-defect/SKILL.md +43 -43
  332. package/skills/orch-pipeline/SKILL.md +121 -121
  333. package/skills/orch-refine-code/SKILL.md +44 -44
  334. package/skills/parallel-execution-optimizer/SKILL.md +74 -74
  335. package/skills/perl-patterns/SKILL.md +505 -505
  336. package/skills/perl-security/SKILL.md +504 -504
  337. package/skills/perl-testing/SKILL.md +476 -476
  338. package/skills/plan-canvas/SKILL.md +153 -153
  339. package/skills/plan-orchestrate/SKILL.md +263 -263
  340. package/skills/plankton-code-quality/SKILL.md +237 -237
  341. package/skills/postgres-patterns/SKILL.md +148 -148
  342. package/skills/prediction-market-oracle-research/SKILL.md +64 -64
  343. package/skills/prediction-market-risk-review/SKILL.md +61 -61
  344. package/skills/premium-web-design/SKILL.md +154 -154
  345. package/skills/prisma-patterns/SKILL.md +401 -401
  346. package/skills/product-capability/SKILL.md +142 -142
  347. package/skills/product-lens/SKILL.md +93 -93
  348. package/skills/production-audit/SKILL.md +207 -207
  349. package/skills/production-scheduling/SKILL.md +238 -238
  350. package/skills/project-flow-ops/SKILL.md +112 -112
  351. package/skills/prompt-optimizer/SKILL.md +398 -398
  352. package/skills/python-patterns/SKILL.md +751 -751
  353. package/skills/python-testing/SKILL.md +817 -817
  354. package/skills/pytorch-patterns/SKILL.md +397 -397
  355. package/skills/quality-nonconformance/SKILL.md +260 -260
  356. package/skills/quarkus-patterns/SKILL.md +723 -723
  357. package/skills/quarkus-security/SKILL.md +468 -468
  358. package/skills/quarkus-tdd/SKILL.md +812 -812
  359. package/skills/quarkus-verification/SKILL.md +480 -480
  360. package/skills/ralphinho-rfc-pipeline/SKILL.md +68 -68
  361. package/skills/react-native-patterns/SKILL.md +326 -326
  362. package/skills/react-patterns/SKILL.md +342 -342
  363. package/skills/react-performance/SKILL.md +575 -575
  364. package/skills/react-testing/SKILL.md +424 -424
  365. package/skills/recsys-pipeline-architect/SKILL.md +115 -115
  366. package/skills/recursive-decision-ledger/SKILL.md +81 -81
  367. package/skills/redis-patterns/SKILL.md +404 -404
  368. package/skills/regex-vs-llm-structured-text/SKILL.md +221 -221
  369. package/skills/remotion-video-creation/SKILL.md +43 -43
  370. package/skills/repo-scan/SKILL.md +79 -79
  371. package/skills/research-ops/SKILL.md +113 -113
  372. package/skills/returns-reverse-logistics/SKILL.md +240 -240
  373. package/skills/rules-distill/SKILL.md +265 -265
  374. package/skills/rust-patterns/SKILL.md +500 -500
  375. package/skills/rust-testing/SKILL.md +501 -501
  376. package/skills/safety-guard/SKILL.md +76 -76
  377. package/skills/santa-method/SKILL.md +307 -307
  378. package/skills/scientific-db-pubmed-database/SKILL.md +176 -176
  379. package/skills/scientific-db-uspto-database/SKILL.md +178 -178
  380. package/skills/scientific-pkg-gget/SKILL.md +167 -167
  381. package/skills/scientific-thinking-literature-review/SKILL.md +193 -193
  382. package/skills/scientific-thinking-scholar-evaluation/SKILL.md +161 -161
  383. package/skills/search-first/SKILL.md +183 -183
  384. package/skills/security-bounty-hunter/SKILL.md +100 -100
  385. package/skills/security-review/SKILL.md +504 -504
  386. package/skills/security-scan/SKILL.md +166 -166
  387. package/skills/seo/SKILL.md +155 -155
  388. package/skills/skill-comply/SKILL.md +59 -59
  389. package/skills/skill-scout/SKILL.md +141 -141
  390. package/skills/skill-stocktake/SKILL.md +195 -195
  391. package/skills/social-graph-ranker/SKILL.md +155 -155
  392. package/skills/social-publisher/SKILL.md +130 -130
  393. package/skills/springboot-patterns/SKILL.md +315 -315
  394. package/skills/springboot-security/SKILL.md +273 -273
  395. package/skills/springboot-tdd/SKILL.md +159 -159
  396. package/skills/springboot-verification/SKILL.md +232 -232
  397. package/skills/strategic-compact/SKILL.md +142 -142
  398. package/skills/swift-actor-persistence/SKILL.md +144 -144
  399. package/skills/swift-concurrency-6-2/SKILL.md +216 -216
  400. package/skills/swift-protocol-di-testing/SKILL.md +191 -191
  401. package/skills/swiftui-patterns/SKILL.md +259 -259
  402. package/skills/taste/SKILL.md +264 -264
  403. package/skills/taste/references/genre-taxonomy.md +87 -87
  404. package/skills/tdd-workflow/SKILL.md +583 -583
  405. package/skills/team-agent-orchestration/SKILL.md +111 -111
  406. package/skills/team-builder/SKILL.md +169 -169
  407. package/skills/terminal-ops/SKILL.md +110 -110
  408. package/skills/tinystruct-patterns/SKILL.md +279 -279
  409. package/skills/tinystruct-patterns/references/architecture.md +90 -90
  410. package/skills/tinystruct-patterns/references/data-handling.md +60 -60
  411. package/skills/tinystruct-patterns/references/database.md +99 -99
  412. package/skills/tinystruct-patterns/references/routing.md +64 -64
  413. package/skills/tinystruct-patterns/references/system-usage.md +97 -97
  414. package/skills/tinystruct-patterns/references/testing.md +72 -72
  415. package/skills/token-budget-advisor/SKILL.md +134 -134
  416. package/skills/ui-demo/SKILL.md +466 -466
  417. package/skills/ui-to-vue/SKILL.md +135 -135
  418. package/skills/uncloud/SKILL.md +344 -344
  419. package/skills/unified-memory/SKILL.md +170 -170
  420. package/skills/unified-notifications-ops/SKILL.md +188 -188
  421. package/skills/verification-loop/SKILL.md +129 -129
  422. package/skills/video-editing/SKILL.md +311 -311
  423. package/skills/videodb/SKILL.md +375 -375
  424. package/skills/visa-doc-translate/SKILL.md +117 -117
  425. package/skills/vite-patterns/SKILL.md +450 -450
  426. package/skills/vue-patterns/SKILL.md +471 -471
  427. package/skills/windows-desktop-e2e/SKILL.md +888 -888
  428. package/skills/workspace-surface-audit/SKILL.md +126 -126
  429. package/skills/x-api/SKILL.md +235 -235
package/lib/ai.js CHANGED
@@ -45,10 +45,13 @@ const RETRY_BACKOFF_MS = [1500, 4000, 9000];
45
45
  const RETRY_AFTER_CAP_MS = 30000;
46
46
 
47
47
  // Stop must not wait out a backoff: the sleep ends the moment the signal fires.
48
+ // The abort listener is removed when the sleep ends normally, so a long run
49
+ // of retries does not pile listeners onto the run's one signal.
48
50
  const sleep = (ms, signal) => new Promise((r) => {
49
51
  if (signal?.aborted) return r();
50
- const t = setTimeout(r, ms);
51
- signal?.addEventListener('abort', () => { clearTimeout(t); r(); }, { once: true });
52
+ const onAbort = () => { clearTimeout(t); r(); };
53
+ const t = setTimeout(() => { signal?.removeEventListener('abort', onAbort); r(); }, ms);
54
+ signal?.addEventListener('abort', onAbort, { once: true });
52
55
  });
53
56
 
54
57
  /**
@@ -234,13 +237,18 @@ function isAbortError(e) {
234
237
  // This gives every attempt a hard ceiling so a stalled request surfaces as a
235
238
  // real, retryable error instead of an indefinite silent wait.
236
239
  const REQUEST_TIMEOUT_MS = 120_000;
240
+ const ANTHROPIC_TIMEOUT_MS = 300_000;
237
241
 
238
242
  /** Combines the caller's own abort signal (Stop button) with a hard timeout into one signal to hand fetch(). */
239
243
  function withTimeout(signal, ms = REQUEST_TIMEOUT_MS) {
240
244
  const controller = new AbortController();
245
+ // One listener per request on the run's long-lived signal; cleanup() takes
246
+ // it off again, or a run with many model calls trips Node's
247
+ // MaxListenersExceededWarning (11 abort listeners) and leaks them.
248
+ const onAbort = () => controller.abort();
241
249
  if (signal) {
242
250
  if (signal.aborted) controller.abort();
243
- else signal.addEventListener('abort', () => controller.abort(), { once: true });
251
+ else signal.addEventListener('abort', onAbort, { once: true });
244
252
  }
245
253
  const timer = setTimeout(() => controller.abort(new Error('timeout')), ms);
246
254
  return {
@@ -249,7 +257,7 @@ function withTimeout(signal, ms = REQUEST_TIMEOUT_MS) {
249
257
  // user's own Stop - callers use this to report "the request stalled"
250
258
  // instead of silently treating a stall as if the user had cancelled it.
251
259
  isTimeout: () => controller.signal.reason instanceof Error && controller.signal.reason.message === 'timeout',
252
- cleanup: () => clearTimeout(timer),
260
+ cleanup: () => { clearTimeout(timer); signal?.removeEventListener('abort', onAbort); },
253
261
  };
254
262
  }
255
263
 
@@ -262,22 +270,25 @@ function withTimeout(signal, ms = REQUEST_TIMEOUT_MS) {
262
270
  */
263
271
  function withIdleTimeout(signal, ms = REQUEST_TIMEOUT_MS) {
264
272
  const controller = new AbortController();
273
+ const onAbort = () => controller.abort();
265
274
  if (signal) {
266
275
  if (signal.aborted) controller.abort();
267
- else signal.addEventListener('abort', () => controller.abort(), { once: true });
276
+ else signal.addEventListener('abort', onAbort, { once: true });
268
277
  }
278
+ let done = false;
269
279
  let timer = setTimeout(() => controller.abort(new Error('timeout')), ms);
270
280
  return {
271
281
  signal: controller.signal,
272
- poke: () => { clearTimeout(timer); timer = setTimeout(() => controller.abort(new Error('timeout')), ms); },
282
+ // A no-op once cleaned up, so a late chunk cannot restart a timer nobody clears.
283
+ poke: () => { if (done) return; clearTimeout(timer); timer = setTimeout(() => controller.abort(new Error('timeout')), ms); },
273
284
  isTimeout: () => controller.signal.reason instanceof Error && controller.signal.reason.message === 'timeout',
274
- cleanup: () => clearTimeout(timer),
285
+ cleanup: () => { done = true; clearTimeout(timer); signal?.removeEventListener('abort', onAbort); },
275
286
  };
276
287
  }
277
288
 
278
289
  async function chatViaProxy(messages, opts) {
279
290
  const token = await getAccessToken();
280
- if (!token) return { success: false, error: 'Not signed in. Sign in to use Auto, or pick one of your own models.' };
291
+ if (!token) return { success: false, error: 'Not signed in. Sign in to use Haze 2, or pick one of your own models.' };
281
292
 
282
293
  return withRetries(async () => {
283
294
  let res, body;
@@ -299,6 +310,7 @@ async function chatViaProxy(messages, opts) {
299
310
  signal,
300
311
  });
301
312
  body = await res.json().catch(() => ({}));
313
+ if (isTimeout()) return { retryable: true, error: 'The AI proxy stopped sending its answer partway - retrying.' };
302
314
  } catch (e) {
303
315
  if (isTimeout()) return { retryable: true, error: 'The request timed out with no response from the AI proxy - retrying.' };
304
316
  if (isAbortError(e)) return { aborted: true };
@@ -478,8 +490,11 @@ async function streamingChatRequest({ url, label, model, apiKey, isLocal, messag
478
490
  const isStream = (res.headers.get('content-type') || '').includes('text/event-stream');
479
491
 
480
492
  if (!isStream) {
481
- cleanup(); // no more bytes expected - the idle clock has nothing left to guard
493
+ // The clock keeps guarding the body read: clearing it before res.json()
494
+ // left a server that sent headers and then went quiet hanging forever.
482
495
  const body = await res.json().catch(() => ({}));
496
+ cleanup();
497
+ if (isTimeout()) return { retryable: true, error: `${label} stopped sending data mid-response - retrying.` };
483
498
  if (res.ok && body.choices?.[0]) {
484
499
  return { done: true, value: { success: true, data: body, modelUsed: body.model || model } };
485
500
  }
@@ -516,7 +531,6 @@ async function streamingChatRequest({ url, label, model, apiKey, isLocal, messag
516
531
  const toolCalls = [];
517
532
  try {
518
533
  for await (const chunk of res.body) {
519
- poke(); // a real chunk arrived - the stream is alive, push the stall clock back out
520
534
  buffer += Buffer.isBuffer(chunk) ? chunk.toString('utf8') : Buffer.from(chunk).toString('utf8');
521
535
  let nlIndex;
522
536
  while ((nlIndex = buffer.indexOf('\n')) !== -1) {
@@ -524,7 +538,12 @@ async function streamingChatRequest({ url, label, model, apiKey, isLocal, messag
524
538
  buffer = buffer.slice(nlIndex + 1);
525
539
  if (!line.startsWith('data:')) continue;
526
540
  const payload = line.slice(5).trim();
527
- if (!payload || payload === '[DONE]') continue;
541
+ if (!payload) continue;
542
+ // Only real data pushes the stall clock back out. Keep-alive comments
543
+ // (": OPENROUTER PROCESSING") used to count, so an upstream that
544
+ // never answered but kept pinging held the run open forever.
545
+ poke();
546
+ if (payload === '[DONE]') continue;
528
547
  let evt;
529
548
  try { evt = JSON.parse(payload); } catch { continue; }
530
549
  modelUsed = evt.model || modelUsed;
@@ -663,6 +682,7 @@ async function chatViaOpenAICompatible(messages, opts, providerName, cfg) {
663
682
  signal,
664
683
  });
665
684
  body = await res.json().catch(() => ({}));
685
+ if (isTimeout()) return { retryable: true, error: `${label} stopped sending its answer partway - retrying.` };
666
686
  } catch (e) {
667
687
  if (isTimeout()) return { retryable: true, error: `${label} timed out with no response - retrying.` };
668
688
  if (isAbortError(e)) return { aborted: true };
@@ -793,7 +813,11 @@ async function chatViaAnthropic(messages, opts, cfg) {
793
813
  }
794
814
 
795
815
  return withRetries(async () => {
796
- let res;
816
+ let res, body;
817
+ // This call is not streamed, so nothing arrives until the whole answer is
818
+ // ready: a longer ceiling than the others, but a ceiling. Without one a
819
+ // stalled connection here waited forever with no events at all.
820
+ const { signal, isTimeout, cleanup } = withTimeout(opts.signal, ANTHROPIC_TIMEOUT_MS);
797
821
  try {
798
822
  res = await fetch('https://api.anthropic.com/v1/messages', {
799
823
  method: 'POST',
@@ -810,15 +834,18 @@ async function chatViaAnthropic(messages, opts, cfg) {
810
834
  ...temperatureParam(model, opts),
811
835
  ...(opts.tools ? { tools: toAnthropicTools(opts.tools) } : {}),
812
836
  }),
813
- signal: opts.signal,
837
+ signal,
814
838
  });
839
+ body = await res.json().catch(() => ({}));
840
+ if (isTimeout()) return { retryable: true, error: 'Anthropic stopped sending its answer partway - retrying.' };
815
841
  } catch (e) {
842
+ if (isTimeout()) return { retryable: true, error: 'Anthropic timed out with no response - retrying.' };
816
843
  if (isAbortError(e)) return { aborted: true };
817
844
  return { retryable: true, error: e.message };
845
+ } finally {
846
+ cleanup();
818
847
  }
819
848
 
820
- const body = await res.json().catch(() => ({}));
821
-
822
849
  if (res.ok && Array.isArray(body.content)) {
823
850
  const text = body.content.filter((b) => b.type === 'text').map((b) => b.text).join('');
824
851
  const message = { role: 'assistant', content: text };
@@ -960,9 +987,10 @@ async function chatViaOllamaNative(messages, opts, m) {
960
987
  }
961
988
 
962
989
  if (!res.ok) {
963
- cleanup();
964
- if (m.research === 'cloud' && (res.status === 401 || res.status === 403)) return { done: true, value: { success: false, error: researchMode().ERR_CLOUD_KEY } };
990
+ if (m.research === 'cloud' && (res.status === 401 || res.status === 403)) { cleanup(); return { done: true, value: { success: false, error: researchMode().ERR_CLOUD_KEY } }; }
965
991
  const body = await res.json().catch(() => ({}));
992
+ cleanup();
993
+ if (isTimeout()) return { retryable: true, error: 'Ollama stopped sending data mid-response - retrying.' };
966
994
  const msg = body.error || describeStatus(res.status);
967
995
  const fatal = res.status === 404 || /not found|pull/i.test(String(msg));
968
996
  if (fatal) return { done: true, value: { success: false, error: `Ollama: ${msg}${/not found/i.test(String(msg)) ? ` - run \`ollama pull ${m.model}\` first.` : ''}` } };
@@ -1223,12 +1251,11 @@ async function testModel(m) {
1223
1251
  return { ok: true, ms: Date.now() - started, reply: (r.data.choices?.[0]?.message?.content || '').trim().slice(0, 80) };
1224
1252
  }
1225
1253
 
1226
- // ─── Auto ───────────────────────────────────────────────────────────────────
1227
- // "Auto" is Codeply's router (Codeply-App/supabase/functions/auto): Claude
1228
- // Sonnet 5.5 for coding and hard work, Claude Haiku 5.5 for chat, images and
1229
- // background jobs, gpt-oss-120b and Gemma 4 when a daily allowance is used up.
1230
- // It decides per turn on the server, where the Claude key and the budgets
1231
- // live. If the router can't be reached at all, Auto falls back to Gemma 4 31B
1254
+ // ─── Haze 2 (route.auto) ──────────────────────────────────────────────
1255
+ // Haze 2 is Codeply's hosted model: a router that picks the model for each
1256
+ // turn on the server, where the keys and the budgets live. The front door is
1257
+ // the Supabase function Codeply-App/supabase/functions/auto. If the router
1258
+ // can't be reached at all, the client falls back to Gemma 4 31B
1232
1259
  // on Ollama Cloud directly (two account keys: a release build bakes
1233
1260
  // OLLAMA_API_KEY / OLLAMA_API_KEY_FALLBACK in via scripts/embed-secrets.js;
1234
1261
  // from source they come from ~/.codeply/config.json), then the hosted proxy.
@@ -1269,6 +1296,62 @@ function deviceId() {
1269
1296
  return deviceIdCache;
1270
1297
  }
1271
1298
 
1299
+ // Haze 2 routes once per user turn. Every agent step says which turn it
1300
+ // belongs to (opts.haze, from agent.mjs); the router decides on the first step
1301
+ // and keeps the same model, effort and cache for the rest of the turn. The
1302
+ // router's state comes back with each answer and goes out again with the next
1303
+ // turn of the same chat. Memory only: a restart just starts a fresh state.
1304
+ const hazeStates = new Map(); // chatId -> state
1305
+ function hazeField(h) {
1306
+ if (!h) return {};
1307
+ return {
1308
+ haze: {
1309
+ product: h.product || 'craft',
1310
+ surface: h.surface || 'agent', // 'voice': Haze's fast path for live voice (Haiku, no thinking)
1311
+ turnId: h.turnId,
1312
+ continuation: (h.step || 0) > 0,
1313
+ historyCount: h.historyCount || 0,
1314
+ ...(h.screen ? { screen: true } : {}), // this turn carries the user's screen
1315
+ state: hazeStates.get(h.chatId) || undefined,
1316
+ },
1317
+ };
1318
+ }
1319
+ function keepHazeState(h, route) {
1320
+ if (!h || !route || !route.haze || !route.haze.state) return;
1321
+ hazeStates.delete(h.chatId);
1322
+ hazeStates.set(h.chatId, route.haze.state);
1323
+ if (hazeStates.size > 300) hazeStates.delete(hazeStates.keys().next().value);
1324
+ }
1325
+
1326
+ const localClock = (iso) => { try { return new Date(iso).toLocaleTimeString([], { hour: 'numeric', minute: '2-digit' }); } catch { return ''; } };
1327
+
1328
+ // What Haze 2 says about its own limits, once per chat each: answers moved to
1329
+ // lighter models (the day's Claude allowance is used up, or Claude is down),
1330
+ // and a heads-up when the lighter models' 5-hour amount is nearly used.
1331
+ const hazeNoticed = new Map(); // chatId|what -> when it was said
1332
+ function hazeNotice(route, chatId = '') {
1333
+ if (!route) return [];
1334
+ const once = (key, text) => {
1335
+ const k = `${chatId}|${key}`;
1336
+ if (hazeNoticed.has(k)) return '';
1337
+ hazeNoticed.set(k, Date.now());
1338
+ if (hazeNoticed.size > 500) hazeNoticed.delete(hazeNoticed.keys().next().value);
1339
+ return text;
1340
+ };
1341
+ const out = [];
1342
+ const l = route.lighter;
1343
+ if (l && (l.why === 'allowance' || l.why === 'pool')) {
1344
+ out.push(once(`lighter|${l.resetsAt}`, `Using lighter models now: ${l.why === 'pool' ? 'Haze 2 is busy today' : 'today\'s Claude allowance is used up'}. Claude is back at ${localClock(l.resetsAt)}.`));
1345
+ } else if (l && l.why === 'claude-down') {
1346
+ out.push(once(`down|${new Date().toISOString().slice(0, 13)}`, 'Claude isn\'t answering right now, so Haze 2 used lighter models.'));
1347
+ }
1348
+ const f = route.free;
1349
+ if (f && f.limit && f.used >= f.limit * 0.8 && f.resetsAt) {
1350
+ out.push(once(`free80|${f.resetsAt}`, `You've used most of Haze 2's lighter models for now. They reset at ${localClock(f.resetsAt)}.`));
1351
+ }
1352
+ return out.filter(Boolean);
1353
+ }
1354
+
1272
1355
  async function chatViaRouter(messages, opts) {
1273
1356
  const token = await getAccessToken();
1274
1357
  // A cloud run has no sign-in: its usage key (CODEPLY_TRACK_KEY) stands in for the person
@@ -1286,17 +1369,27 @@ async function chatViaRouter(messages, opts) {
1286
1369
  messages: wireMessages(messages),
1287
1370
  ...(opts.tools ? { tools: opts.tools } : {}),
1288
1371
  opts: { json: !!opts.json, maxTokens: opts.maxTokens, temperature: opts.temperature },
1372
+ ...hazeField(opts.haze),
1289
1373
  }),
1290
1374
  signal,
1291
1375
  });
1292
1376
  body = JSON.parse((await res.text()).trim() || '{}');
1293
1377
  } catch (e) {
1294
1378
  if (isAbortError(e) && !isTimeout()) return { aborted: true };
1295
- return { retryable: true, error: isTimeout() ? 'Auto took too long to answer.' : e.message };
1379
+ return { retryable: true, error: isTimeout() ? 'Haze 2 took too long to answer.' : e.message };
1296
1380
  } finally {
1297
1381
  cleanup();
1298
1382
  }
1299
- if (body.success) return { done: true, value: { success: true, data: body.data, modelUsed: body.modelUsed, route: body.route } };
1383
+ if (body.success) {
1384
+ keepHazeState(opts.haze, body.route);
1385
+ return { done: true, value: { success: true, data: body.data, modelUsed: body.modelUsed, route: body.route } };
1386
+ }
1387
+ // Past the lighter models' 5-hour amount: say when it comes back, in the person's own time.
1388
+ if (body.limited) {
1389
+ const at = body.resetsAt ? localClock(body.resetsAt) : '';
1390
+ const error = at ? String(body.error || '').replace(/It resets in [^,.]+/, `It resets at ${at}`) : body.error;
1391
+ return { done: true, value: { success: false, limited: true, resetsAt: body.resetsAt || null, error: error || 'You\'ve reached Haze 2\'s limit for now.' } };
1392
+ }
1300
1393
  if (body.error) return { done: true, value: { success: false, error: body.error } };
1301
1394
  return { retryable: isTransientStatus(res.status), retryAfterMs: retryAfterMs(res), error: describeStatus(res.status) };
1302
1395
  }, opts.signal);
@@ -1304,7 +1397,8 @@ async function chatViaRouter(messages, opts) {
1304
1397
 
1305
1398
  async function chatViaAuto(messages, opts) {
1306
1399
  const routed = await chatViaRouter(messages, opts);
1307
- if (routed.success || routed.aborted) return routed;
1400
+ // A limit is an answer, not an outage: no going around it on the direct route.
1401
+ if (routed.success || routed.aborted || routed.limited) return routed;
1308
1402
  // The router itself is unreachable or broken: the old direct route still works.
1309
1403
  const cfg = getConfig();
1310
1404
  const keys = { apiKey: cfg.ollama.apiKey, apiKeyFallback: cfg.ollama.apiKeyFallback };
@@ -1444,4 +1538,18 @@ async function chatJson(messages, opts = {}) {
1444
1538
  return { success: true, json: parsed, usage: r.data.usage || {}, modelUsed: r.modelUsed };
1445
1539
  }
1446
1540
 
1447
- module.exports = { chatResearch, chat, chatJson, isRateLimitError, listOllamaModels, testModel, chatCompletionsUrl };
1541
+ /**
1542
+ * Gemma 4 31B on Ollama Cloud, which can see images: what voice mode uses when
1543
+ * Haze 2 is on its free tier (the day's Claude allowance is used up), since
1544
+ * Haze's free model and the hosted proxy are text only.
1545
+ */
1546
+ async function chatVision(messages, opts = {}) {
1547
+ const cfg = getConfig();
1548
+ const keys = { apiKey: cfg.ollama.apiKey, apiKeyFallback: cfg.ollama.apiKeyFallback };
1549
+ if (!keys.apiKey && !keys.apiKeyFallback) return { success: false, error: 'This build has no Gemma key for screenshots.' };
1550
+ const r = await chatViaOllama(messages, opts, { ollama: { ...AUTO_MODEL, ...keys, numCtx: null } });
1551
+ if (r && r.success && !r.modelUsed) r.modelUsed = AUTO_MODEL.model;
1552
+ return r;
1553
+ }
1554
+
1555
+ module.exports = { chatResearch, chat, chatJson, chatVision, isRateLimitError, listOllamaModels, testModel, chatCompletionsUrl, hazeNotice };
package/lib/ai.mjs CHANGED
@@ -1,6 +1,6 @@
1
- import { createRequire } from 'module';
2
- const require = createRequire(import.meta.url);
3
-
4
- const ai = require('../lib/ai.js');
5
- export default ai;
6
- export const { chat, chatJson, isRateLimitError } = ai;
1
+ import { createRequire } from 'module';
2
+ const require = createRequire(import.meta.url);
3
+
4
+ const ai = require('../lib/ai.js');
5
+ export default ai;
6
+ export const { chat, chatJson, isRateLimitError } = ai;