twinclaw 1.0.3 → 1.1.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/.env.example +71 -0
- package/.githooks/pre-commit +5 -0
- package/.github/copilot-instructions.md +170 -0
- package/.github/skills/find-skills/SKILL.md +133 -0
- package/.github/skills/frontend-design/LICENSE.txt +177 -0
- package/.github/skills/frontend-design/SKILL.md +94 -0
- package/.github/skills/humanist-web-style/SKILL.md +170 -0
- package/.github/workflows/main.yml +137 -0
- package/.skills/frontend-design/frontend-design.md +94 -0
- package/.vscode/settings.json +7 -0
- package/Dockerfile +19 -0
- package/README.md +67 -64
- package/bootstrap.ps1 +31 -0
- package/conductor/AGENT_GUIDE.md +27 -0
- package/conductor/CONSISTENCY_CHECK.md +143 -0
- package/conductor/archive/api_health_hard_gate_20260221/index.md +7 -0
- package/conductor/archive/api_health_hard_gate_20260221/metadata.json +10 -0
- package/conductor/archive/api_health_hard_gate_20260221/plan.md +13 -0
- package/conductor/archive/api_health_hard_gate_20260221/spec.md +13 -0
- package/conductor/archive/browser_ref_mapping_20260220/metadata.json +8 -0
- package/conductor/archive/browser_ref_mapping_20260220/plan.md +28 -0
- package/conductor/archive/browser_ref_mapping_20260220/spec.md +23 -0
- package/conductor/archive/browser_skills_20260220/index.md +5 -0
- package/conductor/archive/browser_skills_20260220/metadata.json +8 -0
- package/conductor/archive/browser_skills_20260220/plan.md +25 -0
- package/conductor/archive/browser_skills_20260220/spec.md +15 -0
- package/conductor/archive/build_contract_recovery_20260220/index.md +5 -0
- package/conductor/archive/build_contract_recovery_20260220/metadata.json +8 -0
- package/conductor/archive/build_contract_recovery_20260220/plan.md +28 -0
- package/conductor/archive/build_contract_recovery_20260220/spec.md +16 -0
- package/conductor/archive/channels_login_doctor_20260221/index.md +5 -0
- package/conductor/archive/channels_login_doctor_20260221/metadata.json +8 -0
- package/conductor/archive/channels_login_doctor_20260221/plan.md +28 -0
- package/conductor/archive/channels_login_doctor_20260221/spec.md +17 -0
- package/conductor/archive/ci_release_gate_enforcement_20260221/index.md +7 -0
- package/conductor/archive/ci_release_gate_enforcement_20260221/metadata.json +10 -0
- package/conductor/archive/ci_release_gate_enforcement_20260221/plan.md +17 -0
- package/conductor/archive/ci_release_gate_enforcement_20260221/spec.md +13 -0
- package/conductor/archive/cli_hardening_onboarding_20260220/metadata.json +8 -0
- package/conductor/archive/cli_hardening_onboarding_20260220/plan.md +29 -0
- package/conductor/archive/cli_hardening_onboarding_20260220/spec.md +17 -0
- package/conductor/archive/config_env_validation_20260220/index.md +5 -0
- package/conductor/archive/config_env_validation_20260220/metadata.json +8 -0
- package/conductor/archive/config_env_validation_20260220/plan.md +28 -0
- package/conductor/archive/config_env_validation_20260220/spec.md +16 -0
- package/conductor/archive/config_json_foundation_20260221/index.md +5 -0
- package/conductor/archive/config_json_foundation_20260221/metadata.json +8 -0
- package/conductor/archive/config_json_foundation_20260221/plan.md +28 -0
- package/conductor/archive/config_json_foundation_20260221/spec.md +17 -0
- package/conductor/archive/context_budgeting_memory_lifecycle_20260220/metadata.json +8 -0
- package/conductor/archive/context_budgeting_memory_lifecycle_20260220/plan.md +28 -0
- package/conductor/archive/context_budgeting_memory_lifecycle_20260220/spec.md +17 -0
- package/conductor/archive/control_plane_api_endpoints_20260220/metadata.json +8 -0
- package/conductor/archive/control_plane_api_endpoints_20260220/plan.md +28 -0
- package/conductor/archive/control_plane_api_endpoints_20260220/spec.md +17 -0
- package/conductor/archive/control_plane_observability_20260220/metadata.json +8 -0
- package/conductor/archive/control_plane_observability_20260220/plan.md +28 -0
- package/conductor/archive/control_plane_observability_20260220/spec.md +17 -0
- package/conductor/archive/control_plane_websocket_streaming_20260220/metadata.json +8 -0
- package/conductor/archive/control_plane_websocket_streaming_20260220/plan.md +28 -0
- package/conductor/archive/control_plane_websocket_streaming_20260220/spec.md +18 -0
- package/conductor/archive/core_persona_20260220/index.md +5 -0
- package/conductor/archive/core_persona_20260220/metadata.json +8 -0
- package/conductor/archive/core_persona_20260220/plan.md +30 -0
- package/conductor/archive/core_persona_20260220/spec.md +15 -0
- package/conductor/archive/coverage_gap_expansion_20260220/index.md +5 -0
- package/conductor/archive/coverage_gap_expansion_20260220/metadata.json +8 -0
- package/conductor/archive/coverage_gap_expansion_20260220/plan.md +28 -0
- package/conductor/archive/coverage_gap_expansion_20260220/spec.md +16 -0
- package/conductor/archive/cross_session_reasoning_graph_20260220/metadata.json +8 -0
- package/conductor/archive/cross_session_reasoning_graph_20260220/plan.md +30 -0
- package/conductor/archive/cross_session_reasoning_graph_20260220/spec.md +17 -0
- package/conductor/archive/delegation_dag_runtime_20260220/metadata.json +8 -0
- package/conductor/archive/delegation_dag_runtime_20260220/plan.md +29 -0
- package/conductor/archive/delegation_dag_runtime_20260220/spec.md +17 -0
- package/conductor/archive/delivery_queue_deadletter_20260220/metadata.json +8 -0
- package/conductor/archive/delivery_queue_deadletter_20260220/plan.md +28 -0
- package/conductor/archive/delivery_queue_deadletter_20260220/spec.md +17 -0
- package/conductor/archive/dm_pairing_policy_20260221/index.md +5 -0
- package/conductor/archive/dm_pairing_policy_20260221/metadata.json +8 -0
- package/conductor/archive/dm_pairing_policy_20260221/plan.md +28 -0
- package/conductor/archive/dm_pairing_policy_20260221/spec.md +17 -0
- package/conductor/archive/docs_agent_plan_migration_20260221/index.md +5 -0
- package/conductor/archive/docs_agent_plan_migration_20260221/metadata.json +8 -0
- package/conductor/archive/docs_agent_plan_migration_20260221/plan.md +28 -0
- package/conductor/archive/docs_agent_plan_migration_20260221/spec.md +16 -0
- package/conductor/archive/docs_prd_blueprint_migration_20260221/index.md +5 -0
- package/conductor/archive/docs_prd_blueprint_migration_20260221/metadata.json +8 -0
- package/conductor/archive/docs_prd_blueprint_migration_20260221/plan.md +28 -0
- package/conductor/archive/docs_prd_blueprint_migration_20260221/spec.md +16 -0
- package/conductor/archive/docs_track_state_reconciliation_20260221/index.md +7 -0
- package/conductor/archive/docs_track_state_reconciliation_20260221/metadata.json +10 -0
- package/conductor/archive/docs_track_state_reconciliation_20260221/plan.md +19 -0
- package/conductor/archive/docs_track_state_reconciliation_20260221/spec.md +13 -0
- package/conductor/archive/gateway_control_plane_20260220/metadata.json +8 -0
- package/conductor/archive/gateway_control_plane_20260220/plan.md +20 -0
- package/conductor/archive/gateway_control_plane_20260220/spec.md +16 -0
- package/conductor/archive/gateway_supervision_remote_access_20260221/index.md +5 -0
- package/conductor/archive/gateway_supervision_remote_access_20260221/metadata.json +8 -0
- package/conductor/archive/gateway_supervision_remote_access_20260221/plan.md +25 -0
- package/conductor/archive/gateway_supervision_remote_access_20260221/spec.md +17 -0
- package/conductor/archive/groq_tts_migration_20260220/index.md +5 -0
- package/conductor/archive/groq_tts_migration_20260220/metadata.json +8 -0
- package/conductor/archive/groq_tts_migration_20260220/plan.md +28 -0
- package/conductor/archive/groq_tts_migration_20260220/spec.md +16 -0
- package/conductor/archive/gui_runtime_dashboard_20260220/metadata.json +8 -0
- package/conductor/archive/gui_runtime_dashboard_20260220/plan.md +28 -0
- package/conductor/archive/gui_runtime_dashboard_20260220/spec.md +17 -0
- package/conductor/archive/identity_bootstrap_compliance_20260221/index.md +7 -0
- package/conductor/archive/identity_bootstrap_compliance_20260221/metadata.json +10 -0
- package/conductor/archive/identity_bootstrap_compliance_20260221/plan.md +17 -0
- package/conductor/archive/identity_bootstrap_compliance_20260221/spec.md +13 -0
- package/conductor/archive/incident_self_healing_20260220/metadata.json +8 -0
- package/conductor/archive/incident_self_healing_20260220/plan.md +28 -0
- package/conductor/archive/incident_self_healing_20260220/spec.md +17 -0
- package/conductor/archive/install_bootstrap_fastpath_20260220/index.md +5 -0
- package/conductor/archive/install_bootstrap_fastpath_20260220/metadata.json +8 -0
- package/conductor/archive/install_bootstrap_fastpath_20260220/plan.md +28 -0
- package/conductor/archive/install_bootstrap_fastpath_20260220/spec.md +16 -0
- package/conductor/archive/interface_reliability_pipeline_20260220/metadata.json +8 -0
- package/conductor/archive/interface_reliability_pipeline_20260220/plan.md +28 -0
- package/conductor/archive/interface_reliability_pipeline_20260220/spec.md +16 -0
- package/conductor/archive/local_state_backup_recovery_20260220/metadata.json +8 -0
- package/conductor/archive/local_state_backup_recovery_20260220/plan.md +28 -0
- package/conductor/archive/local_state_backup_recovery_20260220/spec.md +17 -0
- package/conductor/archive/mcp_runtime_sandboxing_20260220/metadata.json +8 -0
- package/conductor/archive/mcp_runtime_sandboxing_20260220/plan.md +28 -0
- package/conductor/archive/mcp_runtime_sandboxing_20260220/spec.md +17 -0
- package/conductor/archive/mcp_skill_registry_20260220/metadata.json +8 -0
- package/conductor/archive/mcp_skill_registry_20260220/plan.md +19 -0
- package/conductor/archive/mcp_skill_registry_20260220/spec.md +15 -0
- package/conductor/archive/message_streaming_chunking_20260221/index.md +4 -0
- package/conductor/archive/message_streaming_chunking_20260221/plan.md +26 -0
- package/conductor/archive/message_streaming_chunking_20260221/spec.md +14 -0
- package/conductor/archive/messaging_voice_20260220/index.md +5 -0
- package/conductor/archive/messaging_voice_20260220/metadata.json +8 -0
- package/conductor/archive/messaging_voice_20260220/plan.md +25 -0
- package/conductor/archive/messaging_voice_20260220/spec.md +15 -0
- package/conductor/archive/model_telemetry_fallback_controls_20260220/index.md +5 -0
- package/conductor/archive/model_telemetry_fallback_controls_20260220/metadata.json +8 -0
- package/conductor/archive/model_telemetry_fallback_controls_20260220/plan.md +34 -0
- package/conductor/archive/model_telemetry_fallback_controls_20260220/spec.md +22 -0
- package/conductor/archive/multi_agent_orchestration_20260220/metadata.json +8 -0
- package/conductor/archive/multi_agent_orchestration_20260220/plan.md +28 -0
- package/conductor/archive/multi_agent_orchestration_20260220/spec.md +17 -0
- package/conductor/archive/mvp_gate_v2_validation_20260221/index.md +7 -0
- package/conductor/archive/mvp_gate_v2_validation_20260221/metadata.json +10 -0
- package/conductor/archive/mvp_gate_v2_validation_20260221/plan.md +18 -0
- package/conductor/archive/mvp_gate_v2_validation_20260221/spec.md +13 -0
- package/conductor/archive/mvp_gate_wizard_alignment_20260221/index.md +5 -0
- package/conductor/archive/mvp_gate_wizard_alignment_20260221/metadata.json +8 -0
- package/conductor/archive/mvp_gate_wizard_alignment_20260221/plan.md +28 -0
- package/conductor/archive/mvp_gate_wizard_alignment_20260221/spec.md +17 -0
- package/conductor/archive/mvp_smoke_release_gate_20260220/index.md +5 -0
- package/conductor/archive/mvp_smoke_release_gate_20260220/metadata.json +8 -0
- package/conductor/archive/mvp_smoke_release_gate_20260220/plan.md +28 -0
- package/conductor/archive/mvp_smoke_release_gate_20260220/spec.md +16 -0
- package/conductor/archive/npm_command_reliability_20260220/index.md +5 -0
- package/conductor/archive/npm_command_reliability_20260220/metadata.json +8 -0
- package/conductor/archive/npm_command_reliability_20260220/plan.md +38 -0
- package/conductor/archive/npm_command_reliability_20260220/spec.md +16 -0
- package/conductor/archive/onboard_cli_wizard_20260221/index.md +5 -0
- package/conductor/archive/onboard_cli_wizard_20260221/metadata.json +8 -0
- package/conductor/archive/onboard_cli_wizard_20260221/plan.md +28 -0
- package/conductor/archive/onboard_cli_wizard_20260221/spec.md +17 -0
- package/conductor/archive/persona_state_sync_20260220/metadata.json +8 -0
- package/conductor/archive/persona_state_sync_20260220/plan.md +28 -0
- package/conductor/archive/persona_state_sync_20260220/spec.md +22 -0
- package/conductor/archive/proactive_execution_20260220/metadata.json +8 -0
- package/conductor/archive/proactive_execution_20260220/plan.md +18 -0
- package/conductor/archive/proactive_execution_20260220/spec.md +9 -0
- package/conductor/archive/release_pipeline_rollback_20260220/metadata.json +8 -0
- package/conductor/archive/release_pipeline_rollback_20260220/plan.md +28 -0
- package/conductor/archive/release_pipeline_rollback_20260220/spec.md +17 -0
- package/conductor/archive/release_rollback_drill_20260221/index.md +7 -0
- package/conductor/archive/release_rollback_drill_20260221/metadata.json +10 -0
- package/conductor/archive/release_rollback_drill_20260221/plan.md +17 -0
- package/conductor/archive/release_rollback_drill_20260221/spec.md +14 -0
- package/conductor/archive/reliability_evaluation_harness_20260220/metadata.json +8 -0
- package/conductor/archive/reliability_evaluation_harness_20260220/plan.md +28 -0
- package/conductor/archive/reliability_evaluation_harness_20260220/spec.md +17 -0
- package/conductor/archive/runtime_budget_governance_20260220/metadata.json +8 -0
- package/conductor/archive/runtime_budget_governance_20260220/plan.md +26 -0
- package/conductor/archive/runtime_budget_governance_20260220/spec.md +20 -0
- package/conductor/archive/runtime_env_migration_20260221/index.md +5 -0
- package/conductor/archive/runtime_env_migration_20260221/metadata.json +8 -0
- package/conductor/archive/runtime_env_migration_20260221/plan.md +28 -0
- package/conductor/archive/runtime_env_migration_20260221/spec.md +17 -0
- package/conductor/archive/runtime_health_doctor_20260220/index.md +5 -0
- package/conductor/archive/runtime_health_doctor_20260220/metadata.json +8 -0
- package/conductor/archive/runtime_health_doctor_20260220/plan.md +28 -0
- package/conductor/archive/runtime_health_doctor_20260220/spec.md +16 -0
- package/conductor/archive/secrets_hygiene_rotation_20260221/index.md +15 -0
- package/conductor/archive/secrets_hygiene_rotation_20260221/metadata.json +10 -0
- package/conductor/archive/secrets_hygiene_rotation_20260221/plan.md +21 -0
- package/conductor/archive/secrets_hygiene_rotation_20260221/spec.md +13 -0
- package/conductor/archive/secrets_vault_rotation_20260220/metadata.json +8 -0
- package/conductor/archive/secrets_vault_rotation_20260220/plan.md +28 -0
- package/conductor/archive/secrets_vault_rotation_20260220/spec.md +17 -0
- package/conductor/archive/semantic_memory_20260220/metadata.json +8 -0
- package/conductor/archive/semantic_memory_20260220/plan.md +19 -0
- package/conductor/archive/semantic_memory_20260220/spec.md +10 -0
- package/conductor/archive/skill_packaging_versioning_20260220/metadata.json +8 -0
- package/conductor/archive/skill_packaging_versioning_20260220/plan.md +28 -0
- package/conductor/archive/skill_packaging_versioning_20260220/spec.md +17 -0
- package/conductor/archive/test_coverage_matrix_20260220/metadata.json +8 -0
- package/conductor/archive/test_coverage_matrix_20260220/plan.md +29 -0
- package/conductor/archive/test_coverage_matrix_20260220/spec.md +17 -0
- package/conductor/archive/test_fk_unblock_20260220/index.md +5 -0
- package/conductor/archive/test_fk_unblock_20260220/metadata.json +8 -0
- package/conductor/archive/test_fk_unblock_20260220/plan.md +62 -0
- package/conductor/archive/test_fk_unblock_20260220/spec.md +16 -0
- package/conductor/archive/tool_inventory_mcp_harmonization_20260221/plan.md +26 -0
- package/conductor/archive/tool_inventory_mcp_harmonization_20260221/spec.md +14 -0
- package/conductor/archive/tool_policy_governance_20260220/metadata.json +8 -0
- package/conductor/archive/tool_policy_governance_20260220/plan.md +28 -0
- package/conductor/archive/tool_policy_governance_20260220/spec.md +16 -0
- package/conductor/archive/track_status_reconciliation_20260220/index.md +5 -0
- package/conductor/archive/track_status_reconciliation_20260220/metadata.json +8 -0
- package/conductor/archive/track_status_reconciliation_20260220/plan.md +28 -0
- package/conductor/archive/track_status_reconciliation_20260220/reconciliation_notes.md +105 -0
- package/conductor/archive/track_status_reconciliation_20260220/spec.md +16 -0
- package/conductor/archive/twinclaw_workspace_alignment_20260221/plan.md +25 -0
- package/conductor/archive/twinclaw_workspace_alignment_20260221/spec.md +14 -0
- package/conductor/archive/type_safety_debt_20260220/index.md +5 -0
- package/conductor/archive/type_safety_debt_20260220/metadata.json +8 -0
- package/conductor/archive/type_safety_debt_20260220/plan.md +28 -0
- package/conductor/archive/type_safety_debt_20260220/spec.md +21 -0
- package/conductor/archive/type_safety_reliability_stabilization_20260221/index.md +7 -0
- package/conductor/archive/type_safety_reliability_stabilization_20260221/metadata.json +10 -0
- package/conductor/archive/type_safety_reliability_stabilization_20260221/plan.md +19 -0
- package/conductor/archive/type_safety_reliability_stabilization_20260221/spec.md +13 -0
- package/conductor/archive/user_interfaces_20260220/metadata.json +8 -0
- package/conductor/archive/user_interfaces_20260220/plan.md +19 -0
- package/conductor/archive/user_interfaces_20260220/spec.md +9 -0
- package/conductor/archive/whatsapp_dispatcher_20260220/metadata.json +8 -0
- package/conductor/archive/whatsapp_dispatcher_20260220/plan.md +19 -0
- package/conductor/archive/whatsapp_dispatcher_20260220/spec.md +15 -0
- package/conductor/archive/windows_ci_powershell_alignment_20260221/index.md +12 -0
- package/conductor/archive/windows_ci_powershell_alignment_20260221/metadata.json +11 -0
- package/conductor/archive/windows_ci_powershell_alignment_20260221/plan.md +18 -0
- package/conductor/archive/windows_ci_powershell_alignment_20260221/spec.md +18 -0
- package/conductor/archive/windows_docs_alignment_20260221/index.md +12 -0
- package/conductor/archive/windows_docs_alignment_20260221/metadata.json +11 -0
- package/conductor/archive/windows_docs_alignment_20260221/plan.md +18 -0
- package/conductor/archive/windows_docs_alignment_20260221/spec.md +20 -0
- package/conductor/archive/windows_runtime_cli_enforcement_20260221/index.md +12 -0
- package/conductor/archive/windows_runtime_cli_enforcement_20260221/metadata.json +11 -0
- package/conductor/archive/windows_runtime_cli_enforcement_20260221/plan.md +20 -0
- package/conductor/archive/windows_runtime_cli_enforcement_20260221/spec.md +20 -0
- package/conductor/code_styleguides/node.md +8 -0
- package/conductor/code_styleguides/react.md +9 -0
- package/conductor/code_styleguides/typescript.md +8 -0
- package/conductor/conductor-new-track.md +178 -0
- package/conductor/conductor.md +221 -0
- package/conductor/index.md +14 -0
- package/conductor/product-guidelines.md +17 -0
- package/conductor/product.md +34 -0
- package/conductor/setup_state.json +1 -0
- package/conductor/tech-stack.md +34 -0
- package/conductor/tracks/onboarding_wizard_ux2_20260221/plan.md +16 -0
- package/conductor/tracks.md +164 -0
- package/conductor/workflow.md +16 -0
- package/dist/api/router.js +1 -1
- package/dist/config/config-loader.js +1 -1
- package/dist/config/env-schema.js +2 -2
- package/dist/config/identity-bootstrap.js +55 -55
- package/dist/config/json-config.js +9 -12
- package/dist/config/workspace.js +44 -60
- package/dist/core/channels-cli.js +14 -14
- package/dist/core/cli.js +23 -29
- package/dist/core/context-assembly.js +1 -1
- package/dist/core/doctor.js +14 -14
- package/dist/core/gateway-cli.js +17 -17
- package/dist/core/gateway.js +1 -1
- package/dist/core/heartbeat.js +2 -2
- package/dist/core/logs-cli.js +4 -4
- package/dist/core/onboarding.js +19 -108
- package/dist/core/simplified-onboarding.js +322 -0
- package/dist/index.js +23 -27
- package/dist/interfaces/dispatcher.js +2 -2
- package/dist/interfaces/tui-dashboard.js +3 -3
- package/dist/services/job-scheduler.js +1 -1
- package/dist/services/local-state-backup.js +3 -3
- package/dist/services/mcp-client-adapter.js +3 -3
- package/dist/services/model-router.js +2 -2
- package/dist/services/mvp-gate.js +30 -90
- package/dist/services/policy-engine.js +1 -1
- package/dist/services/release-pipeline.js +3 -3
- package/dist/services/secret-vault.js +2 -2
- package/dist/services/skill-registry.js +1 -1
- package/dist/skills/builtin.js +1 -1
- package/docker-compose.yml +15 -0
- package/docs/PRD.md +167 -0
- package/docs/TwinClaw-blueprint.md +225 -0
- package/docs/configuration-guide.md +112 -0
- package/docs/gate-migration-notes.md +20 -0
- package/docs/model-apis.md +19 -0
- package/docs/mvp-release-checklist.md +156 -0
- package/docs/plan-for-agents.md +104 -0
- package/docs/project-audit.md +187 -0
- package/docs/release-rollback-runbook.md +102 -0
- package/docs/rotation-runbook.md +96 -0
- package/failures.txt +3 -0
- package/failures3.txt +12 -0
- package/gui/README.md +73 -0
- package/gui/eslint.config.js +23 -0
- package/gui/index.html +13 -0
- package/gui/package-lock.json +4152 -0
- package/gui/package.json +33 -0
- package/gui/postcss.config.js +6 -0
- package/gui/public/vite.svg +1 -0
- package/gui/src/App.css +42 -0
- package/gui/src/App.tsx +526 -0
- package/gui/src/assets/react.svg +1 -0
- package/gui/src/hooks/use-dashboard-data.ts +56 -0
- package/gui/src/hooks/use-websocket-stream.ts +114 -0
- package/gui/src/index.css +25 -0
- package/gui/src/main.tsx +10 -0
- package/gui/src/services/api.ts +245 -0
- package/gui/src/services/dashboard-poller.ts +167 -0
- package/gui/src/services/persona-editor-controller.ts +231 -0
- package/gui/src/services/websocket-client.ts +281 -0
- package/gui/tailwind.config.js +23 -0
- package/gui/tsconfig.app.json +28 -0
- package/gui/tsconfig.json +7 -0
- package/gui/tsconfig.node.json +26 -0
- package/gui/vite.config.ts +7 -0
- package/out.json +0 -0
- package/out.txt +0 -0
- package/out2.json +0 -0
- package/out3.json +0 -0
- package/package.json +12 -24
- package/src/api/handlers/browser.ts +199 -0
- package/src/api/handlers/callback.ts +102 -0
- package/src/api/handlers/config-validate.ts +24 -0
- package/src/api/handlers/health.ts +144 -0
- package/src/api/handlers/local-state-backup.ts +153 -0
- package/src/api/handlers/persona-state.ts +79 -0
- package/src/api/handlers/skill-packages.ts +116 -0
- package/src/api/router.ts +343 -0
- package/src/api/runtime-event-producer.ts +133 -0
- package/src/api/shared.ts +99 -0
- package/src/api/websocket-hub.ts +396 -0
- package/src/config/config-loader.ts +31 -0
- package/src/config/env-schema.ts +278 -0
- package/src/config/env-validator.ts +297 -0
- package/src/config/identity-bootstrap.ts +131 -0
- package/src/config/json-config.ts +365 -0
- package/src/config/workspace.ts +215 -0
- package/src/core/channels-cli.ts +90 -0
- package/src/core/cli.ts +122 -0
- package/src/core/context-assembly.ts +38 -0
- package/src/core/doctor.ts +408 -0
- package/src/core/gateway-cli.ts +400 -0
- package/src/core/gateway.ts +598 -0
- package/src/core/heartbeat.ts +72 -0
- package/src/core/lane-executor.ts +167 -0
- package/src/core/logs-cli.ts +77 -0
- package/src/core/onboarding.ts +851 -0
- package/src/core/pairing-cli.ts +102 -0
- package/src/core/secret-vault-cli.ts +243 -0
- package/src/core/simplified-onboarding.ts +372 -0
- package/src/core/types.ts +39 -0
- package/src/index.ts +487 -0
- package/src/interfaces/dispatcher.ts +284 -0
- package/src/interfaces/telegram_handler.ts +107 -0
- package/src/interfaces/tui-dashboard.ts +69 -0
- package/src/interfaces/whatsapp_handler.ts +114 -0
- package/src/release/cli.ts +122 -0
- package/src/release/mvp-gate-cli.ts +145 -0
- package/src/release/twinclaw-config-schema.ts +250 -0
- package/src/services/block-chunker.ts +212 -0
- package/src/services/browser-service.ts +452 -0
- package/src/services/context-lifecycle.ts +412 -0
- package/src/services/db.ts +1534 -0
- package/src/services/delivery-tracker.ts +147 -0
- package/src/services/dm-pairing.ts +338 -0
- package/src/services/embedding-service.ts +155 -0
- package/src/services/file-watcher.ts +154 -0
- package/src/services/inbound-debounce.ts +124 -0
- package/src/services/incident-manager.ts +666 -0
- package/src/services/job-scheduler.ts +221 -0
- package/src/services/local-state-backup.ts +843 -0
- package/src/services/mcp-client-adapter.ts +380 -0
- package/src/services/mcp-server-manager.ts +199 -0
- package/src/services/model-router.ts +1180 -0
- package/src/services/mvp-gate.ts +931 -0
- package/src/services/orchestration-service.ts +606 -0
- package/src/services/persona-state.ts +358 -0
- package/src/services/policy-engine.ts +106 -0
- package/src/services/proactive-notifier.ts +122 -0
- package/src/services/queue-service.ts +204 -0
- package/src/services/release-pipeline.ts +810 -0
- package/src/services/runtime-budget-governor.ts +556 -0
- package/src/services/secret-vault.ts +970 -0
- package/src/services/semantic-memory.ts +339 -0
- package/src/services/skill-package-manager.ts +1114 -0
- package/src/services/skill-registry.ts +151 -0
- package/src/services/streaming-output.ts +113 -0
- package/src/services/stt-service.ts +48 -0
- package/src/services/tts-service.ts +57 -0
- package/src/skills/builtin.ts +1 -1
- package/src/types/mvp-gate.ts +2 -3
- package/src/utils/logger.ts +78 -0
- package/src/utils/retry.ts +100 -0
- package/src/utils/secret-scan.ts +261 -0
- package/tests/api/browser-reference.spec.ts +154 -0
- package/tests/api/callback.spec.ts +122 -0
- package/tests/api/control-plane.spec.ts +424 -0
- package/tests/api/health.spec.ts +177 -0
- package/tests/api/persona-state.spec.ts +91 -0
- package/tests/api/websocket-hub.spec.ts +461 -0
- package/tests/config/json-config.spec.ts +77 -0
- package/tests/config/workspace.spec.ts +275 -0
- package/tests/core/cli.spec.ts +156 -0
- package/tests/core/doctor.spec.ts +356 -0
- package/tests/core/gateway-cli.spec.ts +60 -0
- package/tests/core/logs-cli.spec.ts +80 -0
- package/tests/core/onboarding-setup.spec.ts +160 -0
- package/tests/core/onboarding-wizard.spec.ts +134 -0
- package/tests/core/pairing-cli.spec.ts +65 -0
- package/tests/gui/persona-editor-controller.spec.ts +113 -0
- package/tests/gui/use-dashboard-data.spec.ts +150 -0
- package/tests/harness/context-lifecycle.spec.ts +90 -0
- package/tests/harness/delivery-tracker.spec.ts +61 -0
- package/tests/harness/dispatcher-reliability.spec.ts +86 -0
- package/tests/harness/dispatcher-streaming.spec.ts +238 -0
- package/tests/harness/incident-manager.spec.ts +241 -0
- package/tests/harness/local-state-backup.spec.ts +257 -0
- package/tests/harness/mcp-sandboxing.spec.ts +142 -0
- package/tests/harness/mock-router.ts +78 -0
- package/tests/harness/model-router.spec.ts +274 -0
- package/tests/harness/mvp-gate.spec.ts +487 -0
- package/tests/harness/orchestration-edge.spec.ts +135 -0
- package/tests/harness/persona-state-service.spec.ts +110 -0
- package/tests/harness/policy-engine.spec.ts +85 -0
- package/tests/harness/reasoning-graph.spec.ts +121 -0
- package/tests/harness/release-pipeline.spec.ts +207 -0
- package/tests/harness/retry.spec.ts +51 -0
- package/tests/harness/runner.spec.ts +368 -0
- package/tests/harness/runtime-budget-governor.spec.ts +152 -0
- package/tests/harness/skill-package-manager.spec.ts +234 -0
- package/tests/harness/tool-inventory-harmonization.spec.ts +156 -0
- package/tests/harness/types.ts +35 -0
- package/tests/policy/policy-engine.spec.ts +95 -0
- package/tests/queue/queue-service.spec.ts +82 -0
- package/tests/screenshot.png +0 -0
- package/tests/services/browser-reference.spec.ts +69 -0
- package/tests/services/config-env-validation.spec.ts +352 -0
- package/tests/services/config-loader.spec.ts +75 -0
- package/tests/services/dm-pairing.spec.ts +82 -0
- package/tests/services/mcp-registry.spec.ts +281 -0
- package/tests/services/messaging-voice.spec.ts +225 -0
- package/tests/services/proactive-execution.spec.ts +393 -0
- package/tests/services/secret-vault.spec.ts +116 -0
- package/tests/test-browser.ts +24 -0
- package/tests/utils/logger.spec.ts +28 -0
- package/tsconfig.json +17 -0
- package/twinclaw.default.json +41 -0
- package/vitest.config.ts +18 -0
- package/vitest.workspace.ts +0 -0
- package/vitest_output.txt +0 -0
- package/bin/npm-twinclaw.js +0 -17
- package/bin/postinstall.js +0 -68
- package/bin/run-twinbot-cli.js +0 -36
- package/bin/twinbot.js +0 -4
- package/bin/twinclaw.js +0 -4
package/.env.example
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# ─── Runtime Core (REQUIRED) ────────────────────────────────────────────────
|
|
2
|
+
# Master secret for HMAC webhook signature verification and secret-vault
|
|
3
|
+
# encryption fallback. Must be set before startup.
|
|
4
|
+
API_SECRET=your_api_secret_here
|
|
5
|
+
|
|
6
|
+
# ─── Model Routing ───────────────────────────────────────────────────────────
|
|
7
|
+
# At least one model API key must be present for AI functionality.
|
|
8
|
+
|
|
9
|
+
# Primary model provider (Modal-hosted GLM-5-FP8).
|
|
10
|
+
MODAL_API_KEY=your_modal_api_key_here
|
|
11
|
+
|
|
12
|
+
# First fallback model provider (OpenRouter).
|
|
13
|
+
OPENROUTER_API_KEY=your_openrouter_api_key_here
|
|
14
|
+
|
|
15
|
+
# Second fallback model provider (Google Gemini).
|
|
16
|
+
GEMINI_API_KEY=your_gemini_api_key_here
|
|
17
|
+
|
|
18
|
+
# ─── Telegram Bot ────────────────────────────────────────────────────────────
|
|
19
|
+
# Both keys required to enable Telegram messaging. Obtain token from @BotFather.
|
|
20
|
+
TELEGRAM_BOT_TOKEN=your_telegram_bot_token_here
|
|
21
|
+
|
|
22
|
+
# Your personal Telegram user ID (integer). Only this ID can interact with the bot.
|
|
23
|
+
# Find it by messaging @userinfobot on Telegram.
|
|
24
|
+
TELEGRAM_USER_ID=your telegram_user_id_here
|
|
25
|
+
|
|
26
|
+
# ─── WhatsApp ────────────────────────────────────────────────────────────────
|
|
27
|
+
# Phone number for the WhatsApp native client (E.164 format recommended).
|
|
28
|
+
WHATSAPP_PHONE_NUMBER=your_whatsapp_number_here
|
|
29
|
+
|
|
30
|
+
# ─── Groq (Speech-to-Text & Text-to-Speech) ─────────────────────────────────
|
|
31
|
+
# Required when Telegram or WhatsApp voice messaging is active.
|
|
32
|
+
# Free-tier API key from https://console.groq.com
|
|
33
|
+
GROQ_API_KEY=your_groq_api_key_here
|
|
34
|
+
|
|
35
|
+
# ─── Secret Vault (optional) ────────────────────────────────────────────────
|
|
36
|
+
# Dedicated AES-256 encryption key for the secret vault.
|
|
37
|
+
# Falls back to API_SECRET if unset.
|
|
38
|
+
# SECRET_VAULT_MASTER_KEY=your_vault_master_key_here
|
|
39
|
+
|
|
40
|
+
# Comma-separated list of additional secret names required at startup.
|
|
41
|
+
# SECRET_VAULT_REQUIRED=DB_PASSWORD,SOME_TOKEN
|
|
42
|
+
|
|
43
|
+
# ─── Control Plane API (optional) ───────────────────────────────────────────
|
|
44
|
+
# HTTP port for the control plane API server (default: 3100).
|
|
45
|
+
# API_PORT=3100
|
|
46
|
+
|
|
47
|
+
# ─── Embedding (optional) ────────────────────────────────────────────────────
|
|
48
|
+
# Embedding backend: "openai" (default) or "ollama" for local-only operation.
|
|
49
|
+
# EMBEDDING_PROVIDER=openai
|
|
50
|
+
|
|
51
|
+
# API key for OpenAI-compatible embedding endpoint (takes priority over OPENAI_API_KEY).
|
|
52
|
+
# EMBEDDING_API_KEY=your_embedding_api_key_here
|
|
53
|
+
|
|
54
|
+
# OpenAI API key used as fallback for embeddings when EMBEDDING_API_KEY is unset.
|
|
55
|
+
# OPENAI_API_KEY=your_openai_api_key_here
|
|
56
|
+
|
|
57
|
+
# Custom OpenAI-compatible embedding endpoint URL.
|
|
58
|
+
# EMBEDDING_API_URL=https://api.openai.com/v1/embeddings
|
|
59
|
+
|
|
60
|
+
# Embedding model name (default: text-embedding-3-small).
|
|
61
|
+
# EMBEDDING_MODEL=text-embedding-3-small
|
|
62
|
+
|
|
63
|
+
# Expected embedding vector dimensionality for sqlite-vec storage (default: 1536).
|
|
64
|
+
# Must match your chosen embedding model.
|
|
65
|
+
# MEMORY_EMBEDDING_DIM=1536
|
|
66
|
+
|
|
67
|
+
# Base URL for a local Ollama server (default: http://localhost:11434).
|
|
68
|
+
# OLLAMA_BASE_URL=http://localhost:11434
|
|
69
|
+
|
|
70
|
+
# Ollama embedding model name (default: mxbai-embed-large).
|
|
71
|
+
# OLLAMA_EMBEDDING_MODEL=mxbai-embed-large
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
# Agent Instructions — Full-Stack Web Development
|
|
2
|
+
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
## 1. The Prime Directive — Read Before You Write
|
|
6
|
+
|
|
7
|
+
> **Before suggesting, generating, or modifying a single line of code, you MUST read and understand the existing implementation.**
|
|
8
|
+
|
|
9
|
+
This is non-negotiable. Violating it produces broken, duplicate, or inconsistent code.
|
|
10
|
+
|
|
11
|
+
**Concrete steps before any task:**
|
|
12
|
+
|
|
13
|
+
1. **Discover the codebase structure** — read the top-level directory tree, then drill into the directories most relevant to the task.
|
|
14
|
+
2. **Read every file that will be touched or that depends on what will be touched.** If unsure, read more, not less.
|
|
15
|
+
3. **Trace the data flow end-to-end** — identify where data originates (API, DB, context, mock), how it is transformed, and where it is consumed.
|
|
16
|
+
4. **Identify the established patterns** — naming conventions, service abstraction layers, state management approach, styling system, component structure. Match them exactly.
|
|
17
|
+
5. **Fetch the relevant SKILL.md** — before implementing any non-trivial feature (UI, API, DB, auth, etc.), search for and read the most relevant skill file. This is required, not optional.
|
|
18
|
+
|
|
19
|
+
Only after completing all five steps above should you write or suggest any code.
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## 2. Architecture Principles
|
|
24
|
+
|
|
25
|
+
### Service Abstraction — Absolute Rule
|
|
26
|
+
- **All data access must go through the designated service layer** (e.g., `CmsService`, `ApiService`, or equivalent).
|
|
27
|
+
- Direct `fetch('/api/...')` calls inside components or pages are **strictly forbidden**.
|
|
28
|
+
- If you encounter a raw `fetch` in a component, refactor it into the service layer before proceeding.
|
|
29
|
+
- The service layer is the single source of truth for data contracts between frontend and backend.
|
|
30
|
+
|
|
31
|
+
### Modular Backend
|
|
32
|
+
- Keep backend routers thin — they dispatch only.
|
|
33
|
+
- Business logic lives in isolated handler modules (one concern per file).
|
|
34
|
+
- Shared utilities (CORS, DB helpers, response formatting) go in a `shared.ts` or equivalent.
|
|
35
|
+
- Never add logic to a router that belongs in a handler.
|
|
36
|
+
|
|
37
|
+
### State Management
|
|
38
|
+
- Global state (user session, app config, shared fetched data) lives in context or a dedicated store.
|
|
39
|
+
- Local component state handles only ephemeral UI concerns.
|
|
40
|
+
- Never duplicate global state inside local component state.
|
|
41
|
+
|
|
42
|
+
### Environment Strategy
|
|
43
|
+
- Development uses mocked/local data for fast iteration.
|
|
44
|
+
- Production uses real APIs and databases.
|
|
45
|
+
- Feature flags or env vars (`VITE_*`, etc.) control which path is active — never hardcode environment assumptions.
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## 3. Database & Data Layer
|
|
50
|
+
|
|
51
|
+
### Schema Conventions
|
|
52
|
+
- Every table has: `id` (PK, auto or UUID), `created_at`, `updated_at`.
|
|
53
|
+
- Soft deletes preferred: `status` column (`published` / `draft` / `archived`).
|
|
54
|
+
- Scheduled content uses `scheduled_at` (ISO 8601).
|
|
55
|
+
|
|
56
|
+
### Localization
|
|
57
|
+
- Multi-lingual fields stored as JSON strings: `{"en": "...", "hi": "..."}`.
|
|
58
|
+
- Always serialize with a helper before writing; always parse with a helper before returning to the frontend.
|
|
59
|
+
- Frontend always receives typed DTO objects, never raw JSON strings.
|
|
60
|
+
|
|
61
|
+
### Versioning & Safety
|
|
62
|
+
- Every `PUT`/`PATCH` must fetch the existing row and save a version snapshot **before** applying changes.
|
|
63
|
+
- Never perform destructive updates without a recoverable history.
|
|
64
|
+
|
|
65
|
+
### Write Optimization
|
|
66
|
+
- Avoid high-frequency DB writes. Apply throttling/debouncing for analytics events, rate history, and similar high-volume writes.
|
|
67
|
+
- Debounce frontend-initiated writes via session tracking where possible.
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## 4. Frontend — Design & Aesthetic Standards
|
|
72
|
+
|
|
73
|
+
### Refer the frontend-design.md SKILL file for detailed design guidelines.
|
|
74
|
+
### humanist-web-style.md represents our personal design language and should be loaded by default for all frontend work
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## 5. Code Quality Standards
|
|
79
|
+
|
|
80
|
+
### TypeScript
|
|
81
|
+
- Strict mode always on.
|
|
82
|
+
- No `any`. Use `unknown` and narrow, or define a proper type.
|
|
83
|
+
- Interfaces for object shapes; types for unions and aliases.
|
|
84
|
+
- Exported types live in a dedicated `types/` directory or co-located `*.types.ts` file.
|
|
85
|
+
|
|
86
|
+
### Naming Conventions
|
|
87
|
+
- **Files**: `kebab-case` for components and utilities. Match the project's existing convention exactly.
|
|
88
|
+
- **Components**: `PascalCase`.
|
|
89
|
+
- **Functions & variables**: `camelCase`.
|
|
90
|
+
- **Constants**: `UPPER_SNAKE_CASE`.
|
|
91
|
+
- **Types/Interfaces**: `PascalCase`, prefix interfaces with `I` only if the project already does so.
|
|
92
|
+
|
|
93
|
+
### Error Handling
|
|
94
|
+
- Every async operation has explicit error handling.
|
|
95
|
+
- User-facing errors are friendly and actionable. Internal errors are logged with context.
|
|
96
|
+
- Never swallow errors silently.
|
|
97
|
+
|
|
98
|
+
### Comments & Documentation
|
|
99
|
+
- Comments explain *why*, not *what*. Code explains what.
|
|
100
|
+
- Complex algorithms and non-obvious decisions get a comment.
|
|
101
|
+
- Public service methods get JSDoc.
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## 6. API Design
|
|
106
|
+
|
|
107
|
+
- RESTful by default. Follow existing route conventions precisely.
|
|
108
|
+
- All responses use a consistent envelope: `{ data, error, meta }` or whatever the project already uses — match it.
|
|
109
|
+
- Validate all inputs on the server side. Never trust client data.
|
|
110
|
+
- Return appropriate HTTP status codes (200, 201, 400, 401, 403, 404, 409, 500).
|
|
111
|
+
- CORS headers are set in a single shared location, never scattered across handlers.
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## 7. Security
|
|
116
|
+
|
|
117
|
+
- Never expose secrets, API keys, or credentials in frontend code.
|
|
118
|
+
- Sanitize all user-generated content before storing or rendering.
|
|
119
|
+
- Parameterize all database queries — no string interpolation into SQL.
|
|
120
|
+
- Auth checks happen on the server, never rely solely on frontend guards.
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## 8. Developer Workflow
|
|
125
|
+
|
|
126
|
+
### Before Starting Any Task
|
|
127
|
+
1. Read the task carefully. Identify ambiguities and resolve them before writing code.
|
|
128
|
+
2. Read all relevant existing code (see Section 0).
|
|
129
|
+
3. Fetch the relevant SKILL.md (see Section 1).
|
|
130
|
+
4. Plan the implementation mentally. Identify files to create/modify.
|
|
131
|
+
|
|
132
|
+
### Making Changes
|
|
133
|
+
- Make the smallest change that correctly solves the problem. Don't refactor unrelated code while solving a bug.
|
|
134
|
+
- If you discover a pre-existing bug or anti-pattern while working, flag it separately rather than silently changing unrelated behavior.
|
|
135
|
+
- Run through the change mentally: does it break any existing data flow, type contract, or pattern?
|
|
136
|
+
|
|
137
|
+
### Database Migrations
|
|
138
|
+
- Every schema change gets a migration file. Never mutate the schema directly.
|
|
139
|
+
- Apply locally first, verify, then apply to production.
|
|
140
|
+
- Migration files are append-only — never edit a previously applied migration.
|
|
141
|
+
|
|
142
|
+
### Deployment
|
|
143
|
+
1. `npm run build` — verify zero errors and zero type errors.
|
|
144
|
+
2. Run the local preview and manually verify the changed surfaces.
|
|
145
|
+
3. Deploy via the project's established pipeline.
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## 9. Prohibited Patterns
|
|
150
|
+
|
|
151
|
+
These are hard rules. Finding one of these in existing code is a reason to refactor, not a reason to follow the pattern.
|
|
152
|
+
|
|
153
|
+
- ❌ Raw `fetch` calls in components or pages — use the service layer.
|
|
154
|
+
- ❌ `any` type in TypeScript.
|
|
155
|
+
- ❌ Hardcoded environment-specific values (URLs, keys, flags) outside of env config.
|
|
156
|
+
- ❌ Monolithic backend handlers — keep them modular and single-concern.
|
|
157
|
+
- ❌ Destructive DB updates without versioning/snapshotting.
|
|
158
|
+
- ❌ Placeholder UI with fake data shipped to production.
|
|
159
|
+
- ❌ Inline styles for anything that belongs in the design system.
|
|
160
|
+
- ❌ Logic duplication across the frontend and backend for the same validation rule.
|
|
161
|
+
- ❌ Skipping the "read existing code" step because the task seems small.
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## 10. When in Doubt
|
|
166
|
+
|
|
167
|
+
- **Read more code.** The answer is almost always already in the codebase.
|
|
168
|
+
- **Match the existing pattern**, even if you think a different approach is better. Flag the inconsistency separately.
|
|
169
|
+
- **Ask before assuming** on anything that touches auth, payments, data deletion, or external API contracts.
|
|
170
|
+
- **Fetch the SKILL.md.** It exists for a reason.
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: find-skills
|
|
3
|
+
description: Helps users discover and install agent skills when they ask questions like "how do I do X", "find a skill for X", "is there a skill that can...", or express interest in extending capabilities. This skill should be used when the user is looking for functionality that might exist as an installable skill.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Find Skills
|
|
7
|
+
|
|
8
|
+
This skill helps you discover and install skills from the open agent skills ecosystem.
|
|
9
|
+
|
|
10
|
+
## When to Use This Skill
|
|
11
|
+
|
|
12
|
+
Use this skill when the user:
|
|
13
|
+
|
|
14
|
+
- Asks "how do I do X" where X might be a common task with an existing skill
|
|
15
|
+
- Says "find a skill for X" or "is there a skill for X"
|
|
16
|
+
- Asks "can you do X" where X is a specialized capability
|
|
17
|
+
- Expresses interest in extending agent capabilities
|
|
18
|
+
- Wants to search for tools, templates, or workflows
|
|
19
|
+
- Mentions they wish they had help with a specific domain (design, testing, deployment, etc.)
|
|
20
|
+
|
|
21
|
+
## What is the Skills CLI?
|
|
22
|
+
|
|
23
|
+
The Skills CLI (`npx skills`) is the package manager for the open agent skills ecosystem. Skills are modular packages that extend agent capabilities with specialized knowledge, workflows, and tools.
|
|
24
|
+
|
|
25
|
+
**Key commands:**
|
|
26
|
+
|
|
27
|
+
- `npx skills find [query]` - Search for skills interactively or by keyword
|
|
28
|
+
- `npx skills add <package>` - Install a skill from GitHub or other sources
|
|
29
|
+
- `npx skills check` - Check for skill updates
|
|
30
|
+
- `npx skills update` - Update all installed skills
|
|
31
|
+
|
|
32
|
+
**Browse skills at:** https://skills.sh/
|
|
33
|
+
|
|
34
|
+
## How to Help Users Find Skills
|
|
35
|
+
|
|
36
|
+
### Step 1: Understand What They Need
|
|
37
|
+
|
|
38
|
+
When a user asks for help with something, identify:
|
|
39
|
+
|
|
40
|
+
1. The domain (e.g., React, testing, design, deployment)
|
|
41
|
+
2. The specific task (e.g., writing tests, creating animations, reviewing PRs)
|
|
42
|
+
3. Whether this is a common enough task that a skill likely exists
|
|
43
|
+
|
|
44
|
+
### Step 2: Search for Skills
|
|
45
|
+
|
|
46
|
+
Run the find command with a relevant query:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
npx skills find [query]
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
For example:
|
|
53
|
+
|
|
54
|
+
- User asks "how do I make my React app faster?" → `npx skills find react performance`
|
|
55
|
+
- User asks "can you help me with PR reviews?" → `npx skills find pr review`
|
|
56
|
+
- User asks "I need to create a changelog" → `npx skills find changelog`
|
|
57
|
+
|
|
58
|
+
The command will return results like:
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
Install with npx skills add <owner/repo@skill>
|
|
62
|
+
|
|
63
|
+
vercel-labs/agent-skills@vercel-react-best-practices
|
|
64
|
+
└ https://skills.sh/vercel-labs/agent-skills/vercel-react-best-practices
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### Step 3: Present Options to the User
|
|
68
|
+
|
|
69
|
+
When you find relevant skills, present them to the user with:
|
|
70
|
+
|
|
71
|
+
1. The skill name and what it does
|
|
72
|
+
2. The install command they can run
|
|
73
|
+
3. A link to learn more at skills.sh
|
|
74
|
+
|
|
75
|
+
Example response:
|
|
76
|
+
|
|
77
|
+
```
|
|
78
|
+
I found a skill that might help! The "vercel-react-best-practices" skill provides
|
|
79
|
+
React and Next.js performance optimization guidelines from Vercel Engineering.
|
|
80
|
+
|
|
81
|
+
To install it:
|
|
82
|
+
npx skills add vercel-labs/agent-skills@vercel-react-best-practices
|
|
83
|
+
|
|
84
|
+
Learn more: https://skills.sh/vercel-labs/agent-skills/vercel-react-best-practices
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Step 4: Offer to Install
|
|
88
|
+
|
|
89
|
+
If the user wants to proceed, you can install the skill for them:
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
npx skills add <owner/repo@skill> -g -y
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
The `-g` flag installs globally (user-level) and `-y` skips confirmation prompts.
|
|
96
|
+
|
|
97
|
+
## Common Skill Categories
|
|
98
|
+
|
|
99
|
+
When searching, consider these common categories:
|
|
100
|
+
|
|
101
|
+
| Category | Example Queries |
|
|
102
|
+
| --------------- | ---------------------------------------- |
|
|
103
|
+
| Web Development | react, nextjs, typescript, css, tailwind |
|
|
104
|
+
| Testing | testing, jest, playwright, e2e |
|
|
105
|
+
| DevOps | deploy, docker, kubernetes, ci-cd |
|
|
106
|
+
| Documentation | docs, readme, changelog, api-docs |
|
|
107
|
+
| Code Quality | review, lint, refactor, best-practices |
|
|
108
|
+
| Design | ui, ux, design-system, accessibility |
|
|
109
|
+
| Productivity | workflow, automation, git |
|
|
110
|
+
|
|
111
|
+
## Tips for Effective Searches
|
|
112
|
+
|
|
113
|
+
1. **Use specific keywords**: "react testing" is better than just "testing"
|
|
114
|
+
2. **Try alternative terms**: If "deploy" doesn't work, try "deployment" or "ci-cd"
|
|
115
|
+
3. **Check popular sources**: Many skills come from `vercel-labs/agent-skills` or `ComposioHQ/awesome-claude-skills`
|
|
116
|
+
|
|
117
|
+
## When No Skills Are Found
|
|
118
|
+
|
|
119
|
+
If no relevant skills exist:
|
|
120
|
+
|
|
121
|
+
1. Acknowledge that no existing skill was found
|
|
122
|
+
2. Offer to help with the task directly using your general capabilities
|
|
123
|
+
3. Suggest the user could create their own skill with `npx skills init`
|
|
124
|
+
|
|
125
|
+
Example:
|
|
126
|
+
|
|
127
|
+
```
|
|
128
|
+
I searched for skills related to "xyz" but didn't find any matches.
|
|
129
|
+
I can still help you with this task directly! Would you like me to proceed?
|
|
130
|
+
|
|
131
|
+
If this is something you do often, you could create your own skill:
|
|
132
|
+
npx skills init my-xyz-skill
|
|
133
|
+
```
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
|
|
2
|
+
Apache License
|
|
3
|
+
Version 2.0, January 2004
|
|
4
|
+
http://www.apache.org/licenses/
|
|
5
|
+
|
|
6
|
+
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
7
|
+
|
|
8
|
+
1. Definitions.
|
|
9
|
+
|
|
10
|
+
"License" shall mean the terms and conditions for use, reproduction,
|
|
11
|
+
and distribution as defined by Sections 1 through 9 of this document.
|
|
12
|
+
|
|
13
|
+
"Licensor" shall mean the copyright owner or entity authorized by
|
|
14
|
+
the copyright owner that is granting the License.
|
|
15
|
+
|
|
16
|
+
"Legal Entity" shall mean the union of the acting entity and all
|
|
17
|
+
other entities that control, are controlled by, or are under common
|
|
18
|
+
control with that entity. For the purposes of this definition,
|
|
19
|
+
"control" means (i) the power, direct or indirect, to cause the
|
|
20
|
+
direction or management of such entity, whether by contract or
|
|
21
|
+
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
22
|
+
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
23
|
+
|
|
24
|
+
"You" (or "Your") shall mean an individual or Legal Entity
|
|
25
|
+
exercising permissions granted by this License.
|
|
26
|
+
|
|
27
|
+
"Source" form shall mean the preferred form for making modifications,
|
|
28
|
+
including but not limited to software source code, documentation
|
|
29
|
+
source, and configuration files.
|
|
30
|
+
|
|
31
|
+
"Object" form shall mean any form resulting from mechanical
|
|
32
|
+
transformation or translation of a Source form, including but
|
|
33
|
+
not limited to compiled object code, generated documentation,
|
|
34
|
+
and conversions to other media types.
|
|
35
|
+
|
|
36
|
+
"Work" shall mean the work of authorship, whether in Source or
|
|
37
|
+
Object form, made available under the License, as indicated by a
|
|
38
|
+
copyright notice that is included in or attached to the work
|
|
39
|
+
(an example is provided in the Appendix below).
|
|
40
|
+
|
|
41
|
+
"Derivative Works" shall mean any work, whether in Source or Object
|
|
42
|
+
form, that is based on (or derived from) the Work and for which the
|
|
43
|
+
editorial revisions, annotations, elaborations, or other modifications
|
|
44
|
+
represent, as a whole, an original work of authorship. For the purposes
|
|
45
|
+
of this License, Derivative Works shall not include works that remain
|
|
46
|
+
separable from, or merely link (or bind by name) to the interfaces of,
|
|
47
|
+
the Work and Derivative Works thereof.
|
|
48
|
+
|
|
49
|
+
"Contribution" shall mean any work of authorship, including
|
|
50
|
+
the original version of the Work and any modifications or additions
|
|
51
|
+
to that Work or Derivative Works thereof, that is intentionally
|
|
52
|
+
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
53
|
+
or by an individual or Legal Entity authorized to submit on behalf of
|
|
54
|
+
the copyright owner. For the purposes of this definition, "submitted"
|
|
55
|
+
means any form of electronic, verbal, or written communication sent
|
|
56
|
+
to the Licensor or its representatives, including but not limited to
|
|
57
|
+
communication on electronic mailing lists, source code control systems,
|
|
58
|
+
and issue tracking systems that are managed by, or on behalf of, the
|
|
59
|
+
Licensor for the purpose of discussing and improving the Work, but
|
|
60
|
+
excluding communication that is conspicuously marked or otherwise
|
|
61
|
+
designated in writing by the copyright owner as "Not a Contribution."
|
|
62
|
+
|
|
63
|
+
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
64
|
+
on behalf of whom a Contribution has been received by Licensor and
|
|
65
|
+
subsequently incorporated within the Work.
|
|
66
|
+
|
|
67
|
+
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
68
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
69
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
70
|
+
copyright license to reproduce, prepare Derivative Works of,
|
|
71
|
+
publicly display, publicly perform, sublicense, and distribute the
|
|
72
|
+
Work and such Derivative Works in Source or Object form.
|
|
73
|
+
|
|
74
|
+
3. Grant of Patent License. Subject to the terms and conditions of
|
|
75
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
76
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
77
|
+
(except as stated in this section) patent license to make, have made,
|
|
78
|
+
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
79
|
+
where such license applies only to those patent claims licensable
|
|
80
|
+
by such Contributor that are necessarily infringed by their
|
|
81
|
+
Contribution(s) alone or by combination of their Contribution(s)
|
|
82
|
+
with the Work to which such Contribution(s) was submitted. If You
|
|
83
|
+
institute patent litigation against any entity (including a
|
|
84
|
+
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
85
|
+
or a Contribution incorporated within the Work constitutes direct
|
|
86
|
+
or contributory patent infringement, then any patent licenses
|
|
87
|
+
granted to You under this License for that Work shall terminate
|
|
88
|
+
as of the date such litigation is filed.
|
|
89
|
+
|
|
90
|
+
4. Redistribution. You may reproduce and distribute copies of the
|
|
91
|
+
Work or Derivative Works thereof in any medium, with or without
|
|
92
|
+
modifications, and in Source or Object form, provided that You
|
|
93
|
+
meet the following conditions:
|
|
94
|
+
|
|
95
|
+
(a) You must give any other recipients of the Work or
|
|
96
|
+
Derivative Works a copy of this License; and
|
|
97
|
+
|
|
98
|
+
(b) You must cause any modified files to carry prominent notices
|
|
99
|
+
stating that You changed the files; and
|
|
100
|
+
|
|
101
|
+
(c) You must retain, in the Source form of any Derivative Works
|
|
102
|
+
that You distribute, all copyright, patent, trademark, and
|
|
103
|
+
attribution notices from the Source form of the Work,
|
|
104
|
+
excluding those notices that do not pertain to any part of
|
|
105
|
+
the Derivative Works; and
|
|
106
|
+
|
|
107
|
+
(d) If the Work includes a "NOTICE" text file as part of its
|
|
108
|
+
distribution, then any Derivative Works that You distribute must
|
|
109
|
+
include a readable copy of the attribution notices contained
|
|
110
|
+
within such NOTICE file, excluding those notices that do not
|
|
111
|
+
pertain to any part of the Derivative Works, in at least one
|
|
112
|
+
of the following places: within a NOTICE text file distributed
|
|
113
|
+
as part of the Derivative Works; within the Source form or
|
|
114
|
+
documentation, if provided along with the Derivative Works; or,
|
|
115
|
+
within a display generated by the Derivative Works, if and
|
|
116
|
+
wherever such third-party notices normally appear. The contents
|
|
117
|
+
of the NOTICE file are for informational purposes only and
|
|
118
|
+
do not modify the License. You may add Your own attribution
|
|
119
|
+
notices within Derivative Works that You distribute, alongside
|
|
120
|
+
or as an addendum to the NOTICE text from the Work, provided
|
|
121
|
+
that such additional attribution notices cannot be construed
|
|
122
|
+
as modifying the License.
|
|
123
|
+
|
|
124
|
+
You may add Your own copyright statement to Your modifications and
|
|
125
|
+
may provide additional or different license terms and conditions
|
|
126
|
+
for use, reproduction, or distribution of Your modifications, or
|
|
127
|
+
for any such Derivative Works as a whole, provided Your use,
|
|
128
|
+
reproduction, and distribution of the Work otherwise complies with
|
|
129
|
+
the conditions stated in this License.
|
|
130
|
+
|
|
131
|
+
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
132
|
+
any Contribution intentionally submitted for inclusion in the Work
|
|
133
|
+
by You to the Licensor shall be under the terms and conditions of
|
|
134
|
+
this License, without any additional terms or conditions.
|
|
135
|
+
Notwithstanding the above, nothing herein shall supersede or modify
|
|
136
|
+
the terms of any separate license agreement you may have executed
|
|
137
|
+
with Licensor regarding such Contributions.
|
|
138
|
+
|
|
139
|
+
6. Trademarks. This License does not grant permission to use the trade
|
|
140
|
+
names, trademarks, service marks, or product names of the Licensor,
|
|
141
|
+
except as required for reasonable and customary use in describing the
|
|
142
|
+
origin of the Work and reproducing the content of the NOTICE file.
|
|
143
|
+
|
|
144
|
+
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
145
|
+
agreed to in writing, Licensor provides the Work (and each
|
|
146
|
+
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
147
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
148
|
+
implied, including, without limitation, any warranties or conditions
|
|
149
|
+
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
150
|
+
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
151
|
+
appropriateness of using or redistributing the Work and assume any
|
|
152
|
+
risks associated with Your exercise of permissions under this License.
|
|
153
|
+
|
|
154
|
+
8. Limitation of Liability. In no event and under no legal theory,
|
|
155
|
+
whether in tort (including negligence), contract, or otherwise,
|
|
156
|
+
unless required by applicable law (such as deliberate and grossly
|
|
157
|
+
negligent acts) or agreed to in writing, shall any Contributor be
|
|
158
|
+
liable to You for damages, including any direct, indirect, special,
|
|
159
|
+
incidental, or consequential damages of any character arising as a
|
|
160
|
+
result of this License or out of the use or inability to use the
|
|
161
|
+
Work (including but not limited to damages for loss of goodwill,
|
|
162
|
+
work stoppage, computer failure or malfunction, or any and all
|
|
163
|
+
other commercial damages or losses), even if such Contributor
|
|
164
|
+
has been advised of the possibility of such damages.
|
|
165
|
+
|
|
166
|
+
9. Accepting Warranty or Additional Liability. While redistributing
|
|
167
|
+
the Work or Derivative Works thereof, You may choose to offer,
|
|
168
|
+
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
169
|
+
or other liability obligations and/or rights consistent with this
|
|
170
|
+
License. However, in accepting such obligations, You may act only
|
|
171
|
+
on Your own behalf and on Your sole responsibility, not on behalf
|
|
172
|
+
of any other Contributor, and only if You agree to indemnify,
|
|
173
|
+
defend, and hold each Contributor harmless for any liability
|
|
174
|
+
incurred by, or claims asserted against, such Contributor by reason
|
|
175
|
+
of your accepting any such warranty or additional liability.
|
|
176
|
+
|
|
177
|
+
END OF TERMS AND CONDITIONS
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: frontend-design
|
|
3
|
+
description: Create distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
This skill exists because AI-generated interfaces converge on a recognizable, low-density aesthetic ("The Vercel Clone"). Your job is to produce work that looks like a specific human made it for a specific reason.
|
|
7
|
+
|
|
8
|
+
## Step 1 — The Context Derivator (Mental Sandbox)
|
|
9
|
+
|
|
10
|
+
Do not write code until you answer these three questions. Be specific.
|
|
11
|
+
|
|
12
|
+
**1. The "World" & Density:**
|
|
13
|
+
Where does this live?
|
|
14
|
+
- *High-Stress/Utility (e.g., Trading, Medical, Admin):* Needs **High Density**. Small type (12-14px / `text-xs` or `text-sm`), tight spacing, visible borders, information-first. Distinctiveness comes from *layout precision*, not decoration.
|
|
15
|
+
- *Low-Stress/Expression (e.g., Portfolio, Marketing, Lifestyle):* Needs **Low Density**. Large type, generous whitespace, novel layouts. Distinctiveness comes from *typographic confidence*.
|
|
16
|
+
|
|
17
|
+
**2. The Constraint:**
|
|
18
|
+
Pick ONE constraint that shapes the design:
|
|
19
|
+
- "Must work in direct sunlight" -> High contrast, no subtle grays.
|
|
20
|
+
- "Used primarily via keyboard" -> Focus states are the primary aesthetic.
|
|
21
|
+
- "Data-heavy dashboard" -> No "cards", use tables/lists only.
|
|
22
|
+
- "Editorial focused" -> No images, typography carries the weight.
|
|
23
|
+
|
|
24
|
+
**3. The "Signature" Interaction:**
|
|
25
|
+
Define ONE non-standard interaction or visual element that defines this app:
|
|
26
|
+
- *Example:* "A persistent sidebar that never scrolls."
|
|
27
|
+
- *Example:* "Headings that are smaller than the body copy but bolder."
|
|
28
|
+
- *Example:* "A monochrome palette where the only color is the cursor."
|
|
29
|
+
- *Example:* "Grid lines are always visible."
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## Step 2 — The One-Sentence Commit
|
|
34
|
+
|
|
35
|
+
Summarize your direction in one sentence.
|
|
36
|
+
*Example: "A utilitarian, high-density dashboard for data entry, using monospace fonts and visible grid lines, with no shadows or rounded corners."*
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Step 3 — Visual Execution Guidelines
|
|
41
|
+
|
|
42
|
+
### Typography: Use Cultural Reasoning
|
|
43
|
+
Avoid the "AI Default" stack: Inter, Roboto, Open Sans, Poppins, Space Grotesk. Do not just pick a category; reason about its **cultural association**:
|
|
44
|
+
- **Utility & Engineering:** Use a high-quality Monospace (JetBrains Mono, IBM Plex Mono) to evoke documentation, code, and precision.
|
|
45
|
+
- **Authority & History:** Use a transitional or high-contrast Serif (EB Garamond, Libre Baskerville) to evoke editorial, legacy, and trust.
|
|
46
|
+
- **Modernity & Neutrality:** Use a grotesque (Unica77, Public Sans) but *track it tightly* (-0.02em) to evoke mid-century Swiss design.
|
|
47
|
+
- **Warmth & Humanism:** Use a humanist sans (Gill Sans, Optima) to evoke friendliness without the "softness" of rounded fonts.
|
|
48
|
+
|
|
49
|
+
### Color: Derive from a Core Material
|
|
50
|
+
- **The Core Rule:** Do not use "primary" colors (pure blue, red, green). Use "Muddy" transitions or "Earth" tones (stone, clay, ink, paper).
|
|
51
|
+
- **The Design Logic:** Pick **ONE** material color as your anchor (e.g., `#2D2926` for "Charcoal"). Derive the rest of the palette through relationships:
|
|
52
|
+
- *Surface:* Tint the background with 2-5% of your anchor color.
|
|
53
|
+
- *Borders:* Anchor color at 10-15% opacity.
|
|
54
|
+
- *Contrast:* Anchor color plus a deliberate shift in temperature (e.g., adding 5% blue or amber).
|
|
55
|
+
- **Dark Mode:** Do not use `#000000` or `#121212`. Use a specific deep color derived from your anchor (e.g., deeply desaturated navy or forest green).
|
|
56
|
+
|
|
57
|
+
### Layout: Fight the "Card" Mentality
|
|
58
|
+
AI defaults to "Cards in a Grid." This is lazy.
|
|
59
|
+
- **Try:** Visible grid lines separating content.
|
|
60
|
+
- **Try:** List views instead of cards.
|
|
61
|
+
- **Try:** Split-screen layouts (50/50).
|
|
62
|
+
- **Try:** Sidebar navigation instead of top-bar.
|
|
63
|
+
|
|
64
|
+
### Logic: "Does it need to be a card?"
|
|
65
|
+
If the content is just text, it doesn't need a background color, a shadow, and a border radius. It just needs *space*.
|
|
66
|
+
|
|
67
|
+
### Shadows & Radius
|
|
68
|
+
- **Strict Consistency:** If you use `rounded-lg`, use it everywhere. If you use `rounded-none`, use it everywhere.
|
|
69
|
+
- **Shadows:** Avoid the default distinct "drop shadow". Use subtle, large, diffuse shadows OR harsh, solid, 1px borders (brutalist).
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Step 4 — The "Anti-Slop" Checklist
|
|
74
|
+
|
|
75
|
+
Before outputting code, verify:
|
|
76
|
+
1. **Density Check:** Is the text size 16px+ for a dashboard? -> **Fix it.** (Use 13-14px).
|
|
77
|
+
2. **Whitespace Check:** Am I using `py-24` just to fill space? -> **Fix it.**
|
|
78
|
+
3. **Color Check:** Is the primary color "Blurple" or "Teal"? -> **Change it.**
|
|
79
|
+
4. **Font Check:** Is it Inter or Space Grotesk? -> **Change it.**
|
|
80
|
+
5. **Effect Check:** Am I using Glassmorphism (backdrop-blur)? -> **Remove it.** (Unless explicitly requested).
|
|
81
|
+
6. **Animation Check:** distinct "staggered fade-in"? -> **Remove it.** (Make it instant or a single group fade).
|
|
82
|
+
7. **The Transplant Test:** Could this entire UI be transplanted onto a different product without it feeling generic? If it feels like "The Vercel UI," it **fails.**
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## Implementation Standards
|
|
87
|
+
|
|
88
|
+
- **React Architecture:** Functional components with TypeScript. Use semantic tags (`<header>`, `<main>`, etc.) within your JSX components.
|
|
89
|
+
- **Tailwind Palette:** Use `tailwind.config.ts` for theme extensions. Define logic-based colors (e.g., `surface-primary`, `text-dimmed`) derived from your anchor color.
|
|
90
|
+
- **Accessibility & Motion:**
|
|
91
|
+
- UI must support `prefers-reduced-motion` for all transitions.
|
|
92
|
+
- Interactive elements must satisfy a minimum **44x44px touch target**.
|
|
93
|
+
- Explicit focus states (`focus-visible`) are a requirement, not an afterthought.
|
|
94
|
+
- **Performance:** For fonts, ensure `font-display: swap` is used. Use `next/font` or similar for optimized loading.
|