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/textarea.mjs
CHANGED
|
@@ -1,258 +1,264 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Multiline composer input.
|
|
3
|
-
*
|
|
4
|
-
* ink-text-input is single-line and submits on any \r, which also means pasting
|
|
5
|
-
* a code snippet fires a submit at the first newline. This replaces it.
|
|
6
|
-
*
|
|
7
|
-
* Getting a real shift+enter out of a terminal is the awkward part: by default
|
|
8
|
-
* both enter and shift+enter send the same byte (\r), so they are physically
|
|
9
|
-
* indistinguishable. We enable the kitty keyboard protocol's disambiguation
|
|
10
|
-
* flag on mount (\x1b[>1u), which makes modified enter arrive as CSI 13;<mod>u
|
|
11
|
-
* while leaving ordinary typing alone. Terminals that don't speak it ignore the
|
|
12
|
-
* sequence, so the fallbacks below carry them:
|
|
13
|
-
*
|
|
14
|
-
* shift+enter real, when the terminal supports CSI-u → newline
|
|
15
|
-
* alt+enter arrives as ESC \r → newline
|
|
16
|
-
* ctrl+j arrives as \n, always distinct from \r → newline
|
|
17
|
-
* trailing \ backslash at end of line, then enter → newline
|
|
18
|
-
* enter → submit
|
|
19
|
-
*
|
|
20
|
-
* Ink reports \r as key.return with input '\r'. \n parses as name 'enter', so
|
|
21
|
-
* key.return is false - that difference is what makes ctrl+j detectable.
|
|
22
|
-
*/
|
|
23
|
-
import React from 'react';
|
|
24
|
-
import { Box, Text, useInput } from 'ink';
|
|
25
|
-
|
|
26
|
-
const KITTY_ON = '\x1b[>1u';
|
|
27
|
-
const KITTY_OFF = '\x1b[<u';
|
|
28
|
-
const KITTY_QUERY = '\x1b[?u';
|
|
29
|
-
|
|
30
|
-
// Replies the terminal sends back to our own queries. They arrive on stdin
|
|
31
|
-
// exactly like typed text, so without this they get inserted into the draft.
|
|
32
|
-
const TERMINAL_REPORT = /^\[[?0-9;]*[uRc]$/;
|
|
33
|
-
|
|
34
|
-
const INVERSE = '\x1b[7m'; // the cursor block
|
|
35
|
-
const INVERSE_OFF = '\x1b[27m';
|
|
36
|
-
const GREY = '\x1b[90m'; // placeholder
|
|
37
|
-
const GREY_OFF = '\x1b[39m';
|
|
38
|
-
|
|
39
|
-
// CSI 13;<modifier>u - enter with any modifier held.
|
|
40
|
-
const CSI_MODIFIED_ENTER = /^\[13;\d+u$/;
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Ask the terminal for kitty key disambiguation, then ask whether it took.
|
|
44
|
-
*
|
|
45
|
-
* Windows Terminal does not implement this protocol (it has its own
|
|
46
|
-
* win32-input-mode instead), so on Windows the query simply goes unanswered and
|
|
47
|
-
* shift+enter stays physically identical to enter. That is why the UI reports
|
|
48
|
-
* whichever newline key actually works rather than promising shift+enter
|
|
49
|
-
* everywhere - see `modifiedEnterWorks` in tui.mjs.
|
|
50
|
-
*/
|
|
51
|
-
export function enableModifiedEnter(stdout) {
|
|
52
|
-
if (!stdout || !stdout.isTTY) return () => {};
|
|
53
|
-
let restored = false;
|
|
54
|
-
const restore = () => {
|
|
55
|
-
if (restored) return;
|
|
56
|
-
restored = true;
|
|
57
|
-
try { stdout.write(KITTY_OFF); } catch {}
|
|
58
|
-
};
|
|
59
|
-
try {
|
|
60
|
-
stdout.write(KITTY_ON);
|
|
61
|
-
stdout.write(KITTY_QUERY); // a reply means the protocol is really supported
|
|
62
|
-
} catch {}
|
|
63
|
-
process.once('exit', restore);
|
|
64
|
-
return restore;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/** True for a terminal's answer to one of our capability queries. */
|
|
68
|
-
export function isTerminalReport(input) {
|
|
69
|
-
return TERMINAL_REPORT.test(input);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/** Split a string into rendered rows, wrapping each logical line at `width`. */
|
|
73
|
-
function layout(value, width) {
|
|
74
|
-
const rows = [];
|
|
75
|
-
const logical = value.split('\n');
|
|
76
|
-
for (let li = 0; li < logical.length; li++) {
|
|
77
|
-
const line = logical[li];
|
|
78
|
-
let start = 0;
|
|
79
|
-
do {
|
|
80
|
-
const chunk = line.slice(start, start + width);
|
|
81
|
-
rows.push({ line: li, start, text: chunk });
|
|
82
|
-
start += width;
|
|
83
|
-
} while (start < line.length);
|
|
84
|
-
}
|
|
85
|
-
return rows;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/** Absolute offset of the start of logical line `n`. */
|
|
89
|
-
function lineOffset(value, n) {
|
|
90
|
-
let offset = 0;
|
|
91
|
-
const lines = value.split('\n');
|
|
92
|
-
for (let i = 0; i < n; i++) offset += lines[i].length + 1;
|
|
93
|
-
return offset;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
export default function TextArea({
|
|
97
|
-
value,
|
|
98
|
-
onChange,
|
|
99
|
-
onSubmit,
|
|
100
|
-
placeholder = '',
|
|
101
|
-
width = 60,
|
|
102
|
-
focus = true,
|
|
103
|
-
showCursor = true,
|
|
104
|
-
// When the command palette is open it owns up/down for selection, so the
|
|
105
|
-
// composer must not also move its cursor on those keys.
|
|
106
|
-
allowVertical = true,
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
if (
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
if (
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
if (key.return) {
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
if (key.
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
const
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Multiline composer input.
|
|
3
|
+
*
|
|
4
|
+
* ink-text-input is single-line and submits on any \r, which also means pasting
|
|
5
|
+
* a code snippet fires a submit at the first newline. This replaces it.
|
|
6
|
+
*
|
|
7
|
+
* Getting a real shift+enter out of a terminal is the awkward part: by default
|
|
8
|
+
* both enter and shift+enter send the same byte (\r), so they are physically
|
|
9
|
+
* indistinguishable. We enable the kitty keyboard protocol's disambiguation
|
|
10
|
+
* flag on mount (\x1b[>1u), which makes modified enter arrive as CSI 13;<mod>u
|
|
11
|
+
* while leaving ordinary typing alone. Terminals that don't speak it ignore the
|
|
12
|
+
* sequence, so the fallbacks below carry them:
|
|
13
|
+
*
|
|
14
|
+
* shift+enter real, when the terminal supports CSI-u → newline
|
|
15
|
+
* alt+enter arrives as ESC \r → newline
|
|
16
|
+
* ctrl+j arrives as \n, always distinct from \r → newline
|
|
17
|
+
* trailing \ backslash at end of line, then enter → newline
|
|
18
|
+
* enter → submit
|
|
19
|
+
*
|
|
20
|
+
* Ink reports \r as key.return with input '\r'. \n parses as name 'enter', so
|
|
21
|
+
* key.return is false - that difference is what makes ctrl+j detectable.
|
|
22
|
+
*/
|
|
23
|
+
import React from 'react';
|
|
24
|
+
import { Box, Text, useInput } from 'ink';
|
|
25
|
+
|
|
26
|
+
const KITTY_ON = '\x1b[>1u';
|
|
27
|
+
const KITTY_OFF = '\x1b[<u';
|
|
28
|
+
const KITTY_QUERY = '\x1b[?u';
|
|
29
|
+
|
|
30
|
+
// Replies the terminal sends back to our own queries. They arrive on stdin
|
|
31
|
+
// exactly like typed text, so without this they get inserted into the draft.
|
|
32
|
+
const TERMINAL_REPORT = /^\[[?0-9;]*[uRc]$/;
|
|
33
|
+
|
|
34
|
+
const INVERSE = '\x1b[7m'; // the cursor block
|
|
35
|
+
const INVERSE_OFF = '\x1b[27m';
|
|
36
|
+
const GREY = '\x1b[90m'; // placeholder
|
|
37
|
+
const GREY_OFF = '\x1b[39m';
|
|
38
|
+
|
|
39
|
+
// CSI 13;<modifier>u - enter with any modifier held.
|
|
40
|
+
const CSI_MODIFIED_ENTER = /^\[13;\d+u$/;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Ask the terminal for kitty key disambiguation, then ask whether it took.
|
|
44
|
+
*
|
|
45
|
+
* Windows Terminal does not implement this protocol (it has its own
|
|
46
|
+
* win32-input-mode instead), so on Windows the query simply goes unanswered and
|
|
47
|
+
* shift+enter stays physically identical to enter. That is why the UI reports
|
|
48
|
+
* whichever newline key actually works rather than promising shift+enter
|
|
49
|
+
* everywhere - see `modifiedEnterWorks` in tui.mjs.
|
|
50
|
+
*/
|
|
51
|
+
export function enableModifiedEnter(stdout) {
|
|
52
|
+
if (!stdout || !stdout.isTTY) return () => {};
|
|
53
|
+
let restored = false;
|
|
54
|
+
const restore = () => {
|
|
55
|
+
if (restored) return;
|
|
56
|
+
restored = true;
|
|
57
|
+
try { stdout.write(KITTY_OFF); } catch {}
|
|
58
|
+
};
|
|
59
|
+
try {
|
|
60
|
+
stdout.write(KITTY_ON);
|
|
61
|
+
stdout.write(KITTY_QUERY); // a reply means the protocol is really supported
|
|
62
|
+
} catch {}
|
|
63
|
+
process.once('exit', restore);
|
|
64
|
+
return restore;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/** True for a terminal's answer to one of our capability queries. */
|
|
68
|
+
export function isTerminalReport(input) {
|
|
69
|
+
return TERMINAL_REPORT.test(input);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/** Split a string into rendered rows, wrapping each logical line at `width`. */
|
|
73
|
+
function layout(value, width) {
|
|
74
|
+
const rows = [];
|
|
75
|
+
const logical = value.split('\n');
|
|
76
|
+
for (let li = 0; li < logical.length; li++) {
|
|
77
|
+
const line = logical[li];
|
|
78
|
+
let start = 0;
|
|
79
|
+
do {
|
|
80
|
+
const chunk = line.slice(start, start + width);
|
|
81
|
+
rows.push({ line: li, start, text: chunk });
|
|
82
|
+
start += width;
|
|
83
|
+
} while (start < line.length);
|
|
84
|
+
}
|
|
85
|
+
return rows;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/** Absolute offset of the start of logical line `n`. */
|
|
89
|
+
function lineOffset(value, n) {
|
|
90
|
+
let offset = 0;
|
|
91
|
+
const lines = value.split('\n');
|
|
92
|
+
for (let i = 0; i < n; i++) offset += lines[i].length + 1;
|
|
93
|
+
return offset;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export default function TextArea({
|
|
97
|
+
value,
|
|
98
|
+
onChange,
|
|
99
|
+
onSubmit,
|
|
100
|
+
placeholder = '',
|
|
101
|
+
width = 60,
|
|
102
|
+
focus = true,
|
|
103
|
+
showCursor = true,
|
|
104
|
+
// When the command palette is open it owns up/down for selection, so the
|
|
105
|
+
// composer must not also move its cursor on those keys.
|
|
106
|
+
allowVertical = true,
|
|
107
|
+
// Called with -1 / +1 when up is pressed on the first line or down on the
|
|
108
|
+
// last, for prompt history. Returns true when it handled the key.
|
|
109
|
+
onHistory,
|
|
110
|
+
}) {
|
|
111
|
+
const [cursor, setCursor] = React.useState(value.length);
|
|
112
|
+
|
|
113
|
+
// Keep the cursor inside the value when it changes from outside (e.g. a
|
|
114
|
+
// command completion or a recalled prompt replacing the draft).
|
|
115
|
+
React.useEffect(() => {
|
|
116
|
+
setCursor((c) => Math.min(c, value.length));
|
|
117
|
+
}, [value]);
|
|
118
|
+
|
|
119
|
+
const apply = React.useCallback((next, nextCursor) => {
|
|
120
|
+
onChange(next);
|
|
121
|
+
setCursor(Math.max(0, Math.min(nextCursor, next.length)));
|
|
122
|
+
}, [onChange]);
|
|
123
|
+
|
|
124
|
+
const insert = React.useCallback((text) => {
|
|
125
|
+
const next = value.slice(0, cursor) + text + value.slice(cursor);
|
|
126
|
+
apply(next, cursor + text.length);
|
|
127
|
+
}, [value, cursor, apply]);
|
|
128
|
+
|
|
129
|
+
const newline = React.useCallback(() => insert('\n'), [insert]);
|
|
130
|
+
|
|
131
|
+
useInput((input, key) => {
|
|
132
|
+
if (!focus) return;
|
|
133
|
+
|
|
134
|
+
// ── newline vs submit ──
|
|
135
|
+
if (CSI_MODIFIED_ENTER.test(input)) { newline(); return; }
|
|
136
|
+
// Capability replies must never land in the draft as literal text.
|
|
137
|
+
if (TERMINAL_REPORT.test(input)) return;
|
|
138
|
+
if (key.return && key.shift) { newline(); return; }
|
|
139
|
+
if (!key.return && (input === '\r' || input === '\n')) { newline(); return; } // alt+enter, ctrl+j
|
|
140
|
+
|
|
141
|
+
if (key.return) {
|
|
142
|
+
// Trailing backslash is the universal fallback for terminals that send
|
|
143
|
+
// the same byte for enter and shift+enter.
|
|
144
|
+
if (value.slice(0, cursor).endsWith('\\')) {
|
|
145
|
+
apply(value.slice(0, cursor - 1) + '\n' + value.slice(cursor), cursor);
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
onSubmit(value);
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// ── multi-character input is a paste ──
|
|
153
|
+
if (input.length > 1 && !key.ctrl && !key.meta) {
|
|
154
|
+
insert(input.replace(/\r\n?/g, '\n'));
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// ── editing ──
|
|
159
|
+
if (key.backspace || (key.delete && !key.meta)) {
|
|
160
|
+
// Ink reports the DEL byte (0x7f) as `delete`, which is what most
|
|
161
|
+
// terminals actually send for the backspace key.
|
|
162
|
+
if (cursor > 0) apply(value.slice(0, cursor - 1) + value.slice(cursor), cursor - 1);
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
if (key.ctrl) {
|
|
167
|
+
switch (input) {
|
|
168
|
+
case 'a': setCursor(lineOffset(value, value.slice(0, cursor).split('\n').length - 1)); return;
|
|
169
|
+
case 'e': {
|
|
170
|
+
const lines = value.split('\n');
|
|
171
|
+
const li = value.slice(0, cursor).split('\n').length - 1;
|
|
172
|
+
setCursor(lineOffset(value, li) + lines[li].length);
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
case 'k': {
|
|
176
|
+
const rest = value.slice(cursor);
|
|
177
|
+
const nl = rest.indexOf('\n');
|
|
178
|
+
apply(value.slice(0, cursor) + (nl === -1 ? '' : rest.slice(nl)), cursor);
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
case 'u': {
|
|
182
|
+
const li = value.slice(0, cursor).split('\n').length - 1;
|
|
183
|
+
const start = lineOffset(value, li);
|
|
184
|
+
apply(value.slice(0, start) + value.slice(cursor), start);
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
case 'w': {
|
|
188
|
+
const before = value.slice(0, cursor);
|
|
189
|
+
const trimmed = before.replace(/\s*\S+$/, '');
|
|
190
|
+
apply(trimmed + value.slice(cursor), trimmed.length);
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
default: return;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// ── movement ──
|
|
198
|
+
if (key.leftArrow) { setCursor((c) => Math.max(0, Math.min(c, value.length) - 1)); return; }
|
|
199
|
+
if (key.rightArrow) { setCursor((c) => Math.min(value.length, c + 1)); return; }
|
|
200
|
+
|
|
201
|
+
if (key.upArrow || key.downArrow) {
|
|
202
|
+
if (!allowVertical) return;
|
|
203
|
+
const lines = value.split('\n');
|
|
204
|
+
const li = value.slice(0, cursor).split('\n').length - 1;
|
|
205
|
+
const col = cursor - lineOffset(value, li);
|
|
206
|
+
const target = key.upArrow ? li - 1 : li + 1;
|
|
207
|
+
if (target < 0 || target >= lines.length) {
|
|
208
|
+
if (onHistory && onHistory(key.upArrow ? -1 : 1)) setCursor(Infinity);
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
setCursor(lineOffset(value, target) + Math.min(col, lines[target].length));
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// ── plain character ──
|
|
216
|
+
if (input && !key.meta && !key.ctrl && !key.tab && !key.escape) {
|
|
217
|
+
insert(input);
|
|
218
|
+
}
|
|
219
|
+
}, { isActive: focus });
|
|
220
|
+
|
|
221
|
+
// ── render ──
|
|
222
|
+
const w = Math.max(8, width);
|
|
223
|
+
|
|
224
|
+
if (value.length === 0) {
|
|
225
|
+
return React.createElement(
|
|
226
|
+
Text,
|
|
227
|
+
null,
|
|
228
|
+
showCursor && focus
|
|
229
|
+
? INVERSE + (placeholder[0] || ' ') + INVERSE_OFF +
|
|
230
|
+
GREY + placeholder.slice(1) + GREY_OFF
|
|
231
|
+
: GREY + placeholder + GREY_OFF
|
|
232
|
+
);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
const rows = layout(value, w);
|
|
236
|
+
const lines = value.split('\n');
|
|
237
|
+
const curLine = value.slice(0, cursor).split('\n').length - 1;
|
|
238
|
+
const curCol = cursor - lineOffset(value, curLine);
|
|
239
|
+
|
|
240
|
+
return React.createElement(
|
|
241
|
+
Box,
|
|
242
|
+
{ flexDirection: 'column' },
|
|
243
|
+
...rows.map((row, i) => {
|
|
244
|
+
const isCursorRow =
|
|
245
|
+
focus && showCursor &&
|
|
246
|
+
row.line === curLine &&
|
|
247
|
+
curCol >= row.start &&
|
|
248
|
+
(curCol < row.start + w || (row.start + w >= lines[row.line].length && curCol <= lines[row.line].length));
|
|
249
|
+
|
|
250
|
+
if (!isCursorRow) {
|
|
251
|
+
return React.createElement(Text, { key: i }, row.text || ' ');
|
|
252
|
+
}
|
|
253
|
+
const at = curCol - row.start;
|
|
254
|
+
const before = row.text.slice(0, at);
|
|
255
|
+
const under = row.text[at] ?? ' ';
|
|
256
|
+
const after = row.text.slice(at + 1);
|
|
257
|
+
return React.createElement(
|
|
258
|
+
Text,
|
|
259
|
+
{ key: i },
|
|
260
|
+
before + INVERSE + under + INVERSE_OFF + after
|
|
261
|
+
);
|
|
262
|
+
})
|
|
263
|
+
);
|
|
264
|
+
}
|