{"id":"9879a379-7328-4eae-ad03-6e9733ce7f64","entityType":"agent","slug":"clawhub-asistent-alex-nexlink","name":"Nexlink","canonicalUrl":"https://www.xpersona.co/agent/clawhub-asistent-alex-nexlink","canonicalPath":"/agent/clawhub-asistent-alex-nexlink","generatedAt":"2026-10-10T10:42:51.608Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-10T08:19:32.799Z","emptyReason":null},"description":"🔗 NexLink — Enterprise Connector for Nextcloud, Exchange & YouTube. Built by Firma de AI. Email, calendar, tasks, file management, document understanding, t... Skill: Nexlink Owner: asistent-alex Summary: 🔗 NexLink — Enterprise Connector for Nextcloud, Exchange & YouTube. Built by Firma de AI. Email, calendar, tasks, file management, document understanding, t... Tags: latest:0.15.9 Version history: v0.15.9 | 2026-05-01T19:22:45.265Z | user v0.15.9 v0.15.8 | 2026-05-01T14:25:02.057Z | user Security: per-command --yes only, pinned dependencies, file permissions (0o600/0o700)","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.6K downloads reported by the source. Last updated 10/10/2026.","installCommand":"clawhub skill install s1759tnc5qrpg1zactayctz22d83whm6:nexlink","sourceUrl":"https://clawhub.ai/asistent-alex/nexlink","homepage":"https://clawhub.ai/asistent-alex/skills/nexlink","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/asistent-alex/nexlink","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/asistent-alex/skills/nexlink","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":64,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"🔗 NexLink — Enterprise Connector for Nextcloud, Exchange & YouTube. Built by Firma de AI. Email, calendar, tasks, file management, document understanding, t..."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-10T08:19:32.799Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T08:19:32.799Z","emptyReason":null},"stars":null,"forks":null,"downloads":1563,"packageName":null,"latestVersion":"0.15.9","tractionLabel":"1.6K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T08:19:32.799Z","emptyReason":null},"lastUpdatedAt":"2026-10-10T08:19:32.799Z","lastCrawledAt":"2026-10-10T08:19:32.799Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-11T08:19:32.799Z","lastVerifiedAt":null,"highlights":[{"version":"0.15.9","createdAt":"2026-05-01T19:22:45.265Z","changelog":"v0.15.9","fileCount":50,"zipByteSize":127206},{"version":"0.15.8","createdAt":"2026-05-01T14:25:02.057Z","changelog":"Security: per-command --yes only, pinned dependencies, file permissions (0o600/0o700), branding cleanup, docs update — ClawScan audit remediation","fileCount":49,"zipByteSize":125400},{"version":"0.15.3","createdAt":"2026-05-01T11:58:56.439Z","changelog":"Security fix: replace xml.etree.ElementTree with defusedxml to prevent XXE injection","fileCount":49,"zipByteSize":124540},{"version":"0.15.2","createdAt":"2026-04-30T20:57:48.226Z","changelog":"Security: remove rm -rf from docs, force rescan","fileCount":49,"zipByteSize":124430},{"version":"0.15.1","createdAt":"2026-04-30T20:48:57.756Z","changelog":"Fix ClawHub title rendering + security docs static analysis finding","fileCount":49,"zipByteSize":124426},{"version":"0.15.0","createdAt":"2026-04-30T20:41:41.930Z","changelog":"Security audit remediation: prompt approval system, SECURITY.md, dependency pinning, safe defaults","fileCount":49,"zipByteSize":124424},{"version":"0.14.2","createdAt":"2026-04-30T17:10:25.353Z","changelog":"Sync metadata: clawhub.json aligned with SKILL.md (version, name, description), README branding updated to include YouTube, CHANGELOG cleaned (removed already-shipped items from Unreleased)","fileCount":47,"zipByteSize":117017},{"version":"0.14.1","createdAt":"2026-04-29T22:36:06.410Z","changelog":"Rebranded: Nextcloud, Exchange & YouTube Connector. YouTube transcript extraction now highlighted front-and-center in titles, descriptions, and feature lists.","fileCount":47,"zipByteSize":117061}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s1759tnc5qrpg1zactayctz22d83whm6:nexlink","setupComplexity":"low","setupSteps":["Setup complexity is classified as HIGH. You must provision dedicated cloud infrastructure or an isolated VM. Do not run this directly on your local workstation.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-asistent-alex-nexlink/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-asistent-alex-nexlink/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-asistent-alex-nexlink/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-asistent-alex-nexlink/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-asistent-alex-nexlink/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-asistent-alex-nexlink/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-10T10:42:51.605Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-asistent-alex-nexlink/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-asistent-alex-nexlink/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-asistent-alex-nexlink/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-asistent-alex-nexlink/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-10T08:19:32.799Z","emptyReason":null},"readme":"Skill: Nexlink\n\nOwner: asistent-alex\n\nSummary: 🔗 NexLink — Enterprise Connector for Nextcloud, Exchange & YouTube. Built by Firma de AI. Email, calendar, tasks, file management, document understanding, t...\n\nTags: latest:0.15.9\n\nVersion history:\n\nv0.15.9 | 2026-05-01T19:22:45.265Z | user\n\nv0.15.9\n\nv0.15.8 | 2026-05-01T14:25:02.057Z | user\n\nSecurity: per-command --yes only, pinned dependencies, file permissions (0o600/0o700), branding cleanup, docs update — ClawScan audit remediation\n\nv0.15.3 | 2026-05-01T11:58:56.439Z | user\n\nSecurity fix: replace xml.etree.ElementTree with defusedxml to prevent XXE injection\n\nv0.15.2 | 2026-04-30T20:57:48.226Z | user\n\nSecurity: remove rm -rf from docs, force rescan\n\nv0.15.1 | 2026-04-30T20:48:57.756Z | user\n\nFix ClawHub title rendering + security docs static analysis finding\n\nv0.15.0 | 2026-04-30T20:41:41.930Z | user\n\nSecurity audit remediation: prompt approval system, SECURITY.md, dependency pinning, safe defaults\n\nv0.14.2 | 2026-04-30T17:10:25.353Z | user\n\nSync metadata: clawhub.json aligned with SKILL.md (version, name, description), README branding updated to include YouTube, CHANGELOG cleaned (removed already-shipped items from Unreleased)\n\nv0.14.1 | 2026-04-29T22:36:06.410Z | user\n\nRebranded: Nextcloud, Exchange & YouTube Connector. YouTube transcript extraction now highlighted front-and-center in titles, descriptions, and feature lists.\n\nv0.14.0 | 2026-04-29T22:11:34.030Z | user\n\nYouTube transcript extraction: supports watch/youtu.be/shorts/embed URLs, automatic language fallback, text and JSON output, save to Nextcloud. 55 passing tests.\n\nv0.13.4 | 2026-04-28T23:22:23.919Z | user\n\nrestore: NexLink name, revert to original slug (nexlink)\n\nv0.13.1 | 2026-04-28T23:06:14.913Z | user\n\nfix: correct title order to Exchange & Nextcloud in SKILL.md and README.md\n\nv0.13.0 | 2026-04-28T22:49:17.585Z | user\n\nSEO/listing polish: richer title, description with keywords, categories, README badges\n\nv0.12.0 | 2026-04-28T16:25:42.550Z | user\n\nExchange + Nextcloud contacts modules with full CRUD, search, and integration tests\n\nv0.11.0 | 2026-04-25T12:55:22.841Z | user\n\nOWNER_EMAIL config var, 18 integration tests, cmd_reminders recipient priority chain\n\nv0.10.6 | 2026-04-23T14:49:51.462Z | user\n\nAlign title order with NexLink acronym: Nextcloud & Exchange (was Exchange & Nextcloud). Update SKILL.md description and clawhub.json name+version+description. Zero functional changes.\n\nv0.10.5 | 2026-04-23T14:32:27.752Z | user\n\nTranslate SKILL.md from Romanian to English, update README footer brand line per BRAND.md, remove outdated Roadmap section.\n\nv0.10.4 | 2026-04-22T19:07:59.600Z | user\n\nAdd dependencies declaration in frontmatter. Update version to 0.10.4.\n\nv0.10.3 | 2026-04-22T18:31:05.626Z | user\n\nAdd ABOUT.md. Fix version alignment. Remove all LCM references.\n\nv0.10.2 | 2026-04-22T18:23:07.753Z | user\n\nAdd missing skillKey to frontmatter. Fix version alignment with GitHub. Remove all LCM references.\n\nv0.10.1 | 2026-04-22T18:15:20.219Z | user\n\nRemove LCM references. LCM is a separate plugin, not part of NexLink core. Clean up documentation.\n\nv0.10.0 | 2026-04-22T18:02:44.538Z | user\n\nFix SKILL.md frontmatter for ClawHub compliance\n\nv0.9.0 | 2026-04-22T15:48:51.977Z | user\n\nComplete rebrand: imm-romania → NexLink. All references updated. Built by Firma de AI, supported by Firma de IT.\n\nv0.5.1 | 2026-04-22T15:39:06.571Z | user\n\nComplete rebrand: imm-romania → NexLink. All references updated. Built by Firma de AI, supported by Firma de IT.\n\nv0.5.0 | 2026-04-22T15:00:16.487Z | user\n\nRebranded to NexLink. Exchange & Nextcloud connector with email, calendar, tasks, file management, and document understanding.\n\nArchive index:\n\nArchive v0.15.9: 50 files, 127206 bytes\n\nFiles: ABOUT.md (1963b), assets/config.template.yaml (1872b), BRAND.md (4659b), CHANGELOG.md (13941b), clawhub.json (2144b), config.template.yaml (521b), CONTRIBUTING.md (2106b), modules/exchange/__init__.py (94b), modules/exchange/__main__.py (267b), modules/exchange/analytics.py (17410b), modules/exchange/cal.py (21370b), modules/exchange/cli.py (4523b), modules/exchange/config.py (10217b), modules/exchange/connection.py (7414b), modules/exchange/contacts.py (12105b), modules/exchange/logger.py (9231b), modules/exchange/mail.py (22337b), modules/exchange/SKILL.md (6067b), modules/exchange/sync.py (15477b), modules/exchange/tasks.py (21629b), modules/exchange/utils.py (5582b), modules/nextcloud/contacts.py (23849b), modules/nextcloud/nextcloud.py (67102b), modules/nextcloud/SKILL.md (5301b), modules/youtube/__init__.py (57b), modules/youtube/__main__.py (99b), modules/youtube/youtube.py (10947b), push-commands.sh (824b), README.md (11599b), references/security-best-practices.md (3569b), references/setup.md (4206b), requirements.txt (180b), scripts/nexlink.py (11719b), scripts/validate.sh (2290b), SECURITY.md (1877b), setup.py (1297b), skill-card.md (2639b), SKILL.md (10555b), tasks/state.json (965b), tasks/todo.md (962b), tests/integration/__init__.py (54b), tests/integration/test_sync.py (21491b), tests/test_all.py (11809b), tests/test_contacts.py (17445b), tests/test_exchange_contacts_live.py (13579b), tests/test_nextcloud_contacts_live.py (16744b), tests/test_nextcloud.py (21225b), tests/test_youtube.py (6106b), VERIFICATION.md (4896b), _meta.json (127b)\n\nFile v0.15.9:modules/exchange/SKILL.md\n\n---\nname: exchange\ndescription: Email, Calendar, and Tasks for Exchange on-premises (2016/2019). Use for reading/sending emails, managing calendar events, creating tasks, and syncing with Exchange server. Triggers on phrases like \"send email\", \"check calendar\", \"create task\", \"exchange mail\", \"outlook calendar\".\n---\n\n# Exchange Module\n\nEmail, Calendar, and Tasks operations for Microsoft Exchange Server on-premises (2016/2019) via EWS.\n\n## Requirements\n\n- Exchange Server 2016 or 2019 (on-premises)\n- EWS enabled on server\n- Account with mailbox permissions\n\n## Configuration\n\nSet environment variables:\n\n```bash\nexport EXCHANGE_SERVER=\"https://mail.example.com/EWS/Exchange.asmx\"\nexport EXCHANGE_USERNAME=\"your-username\"\nexport EXCHANGE_PASSWORD=\"your-password\"\nexport EXCHANGE_EMAIL=\"your-email@example.com\"\n```\n\nOr use a config file `config.yaml`:\n\n```yaml\nexchange:\n  server: https://mail.example.com/EWS/Exchange.asmx\n  username: ${EXCHANGE_USERNAME}\n  password: ${EXCHANGE_PASSWORD}\n  email: your-email@example.com\n  verify_ssl: false  # for self-signed certs\n```\n\n## Commands\n\n### Email (mail)\n\n```bash\n# Test connection\npython3 -m modules.exchange mail connect\n\n# List emails\npython3 -m modules.exchange mail read --limit 10\npython3 -m modules.exchange mail read --folder Inbox --unread\npython3 -m modules.exchange mail read --from \"boss@company.com\"\n\n# Send email\npython3 -m modules.exchange mail send --to \"user@example.com\" --subject \"Hello\" --body \"Message\"\n\n# Reply/Forward\npython3 -m modules.exchange mail reply --id EMAIL_ID --body \"Reply text\"\npython3 -m modules.exchange mail forward --id EMAIL_ID --to \"other@example.com\"\n\n# Attachments\npython3 -m modules.exchange mail list-attachments --id EMAIL_ID\npython3 -m modules.exchange mail download-attachment --id EMAIL_ID --name \"file.pdf\"\n```\n\n### Calendar (cal)\n\n```bash\n# List events\npython3 -m modules.exchange cal list --days 7\npython3 -m modules.exchange cal today\npython3 -m modules.exchange cal week\n\n# Create event\npython3 -m modules.exchange cal create --subject \"Meeting\" --start \"2024-01-15 14:00\" --duration 60\n\n# With attendees\npython3 -m modules.exchange cal create --subject \"Team Meeting\" --start \"2024-01-15 14:00\" --to \"user1@example.com,user2@example.com\"\n\n# Update/Delete\npython3 -m modules.exchange cal update --id EVENT_ID --location \"Room 101\"\npython3 -m modules.exchange cal delete --id EVENT_ID\n\n# Respond to meeting\npython3 -m modules.exchange cal respond --id EVENT_ID --response accept\n```\n\n### Tasks (tasks)\n\n```bash\n# List tasks (own mailbox)\npython3 -m modules.exchange tasks list\npython3 -m modules.exchange tasks list --overdue\npython3 -m modules.exchange tasks list --status in_progress\n\n# List tasks from another mailbox (delegate access)\npython3 -m modules.exchange tasks list --mailbox user@example.com\n\n# Create task (in your own mailbox)\npython3 -m modules.exchange tasks create --subject \"Review proposal\" --due \"+7d\" --priority high\n\n# Create task in another user's mailbox (requires delegate permissions)\npython3 -m modules.exchange tasks create --assign-to user@example.com --subject \"Review report\" --due \"2024-01-20\"\n\n# Get task details\npython3 -m modules.exchange tasks get --id TASK_ID\npython3 -m modules.exchange tasks get --id TASK_ID --mailbox user@example.com\n\n# Update task\npython3 -m modules.exchange tasks update --id TASK_ID --subject \"Updated subject\"\npython3 -m modules.exchange tasks update --id TASK_ID --status in_progress\n\n# Complete task\npython3 -m modules.exchange tasks complete --id TASK_ID\n\n# Move task to Deleted Items (trash)\npython3 -m modules.exchange tasks trash --id TASK_ID\npython3 -m modules.exchange tasks trash --mailbox user@example.com --id TASK_ID  # Requires delete permission\n```\n\n**Note on trash:** The `trash` command moves tasks to the Deleted Items folder. For delegate mailboxes, the service account has Editor permissions (can create/edit/complete tasks) but **cannot delete tasks**. This is intentional - tasks are preserved until you manually delete them from Outlook. When trash fails, the error message suggests completing the task or deleting manually from Outlook.\n\n### Error Handling\n\nAll task commands return informative error messages in Romanian with:\n\n- `error`: Clear error message\n- `cause`: Why it happened\n- `alternatives`: Available options\n\n**Example - Permission denied:**\n```json\n{\n  \"ok\": false,\n  \"error\": \"Task-urile pot fi șterse doar manual din Outlook.\",\n  \"cause\": \"Asistentul are permisiuni de Editor (poate crea/edita/completa), dar nu poate șterge task-urile. Aceasta e o limitare intenționată - task-urile se păstrează până le ștergi tu.\",\n  \"alternatives\": [\n    {\"action\": \"complete\", \"description\": \"Marchează task-ul ca finalizat (recomandat)\"},\n    {\"action\": \"manual_delete\", \"description\": \"Șterge manual din Outlook sau OWA\"}\n  ]\n}\n```\n\n**Example - Task not found:**\n```json\n{\n  \"ok\": false,\n  \"error\": \"Task-ul nu a fost găsit.\",\n  \"cause\": \"Task ID xxx nu există sau este invalid.\",\n  \"alternatives\": [\n    {\"action\": \"list\", \"description\": \"Listează task-urile disponibile\"}\n  ]\n}\n```\n\n### Sync (sync)\n\n```bash\n# Bidirectional sync with Exchange\npython3 -m modules.exchange sync sync\n\n# Show sync status\npython3 -m modules.exchange sync status\n\n# Send reminders for overdue/upcoming tasks\npython3 -m modules.exchange sync reminders --hours 24\n\n# Dry-run (show what would be sent)\npython3 -m modules.exchange sync reminders --hours 24 --dry-run\n\n# Create calendar event from task\npython3 -m modules.exchange sync link-calendar --id TASK_ID --time \"14:00\" --duration 60\n```\n\n## Notes\n\n- Tasks are created in your own Tasks folder by default\n- **Task Assignment**: Use `--assign-to user@example.com` to create tasks directly in another user's Exchange mailbox. This requires the service account to have delegate permissions on the target mailbox (configured on the Exchange server).\n- For collaborative tasks, use calendar events with attendees\n- For Exchange Online (Office 365), configuration may differ\n- Self-signed certificates require `verify_ssl: false`\n\nFile v0.15.9:modules/nextcloud/SKILL.md\n\n---\nname: nextcloud\ndescription: File management, document understanding, and workflow intelligence for Nextcloud via WebDAV and OCS APIs. Use for uploading, downloading, listing, searching, extracting text, summarizing files, Q&A over files, extracting workflow actions, creating Exchange tasks from files, sharing, moving, and copying files and folders on Nextcloud. Triggers on phrases like \"upload to nextcloud\", \"download from nextcloud\", \"list files on nextcloud\", \"search nextcloud\", \"summarize nextcloud file\", \"ask nextcloud file\", \"extract actions from file\", \"create tasks from file\", \"create nextcloud share link\", \"nextcloud file operations\".\n---\n\n# Nextcloud Module\n\nFile management on Nextcloud server using WebDAV protocol and OCS sharing APIs.\n\n## Requirements\n\n- Nextcloud instance with WebDAV enabled\n- App password (generate from Nextcloud security settings)\n\n## Configuration\n\nSet environment variables:\n\n```bash\nexport NEXTCLOUD_URL=\"https://cloud.example.com\"\nexport NEXTCLOUD_USERNAME=\"your-username\"\nexport NEXTCLOUD_APP_PASSWORD=\"your-app-password\"\n```\n\n## Commands\n\n### shared\nList folders shared with the current user.\n\n```bash\npython3 -m modules.nextcloud shared\n```\n\nReturns: Name, owner, permissions, and path for each shared folder.\n\n### list\nList files and folders in a directory.\n\n```bash\npython3 -m modules.nextcloud list /path/to/directory/\npython3 -m modules.nextcloud list /path/to/directory/ --recursive\n```\n\nReturns: File name, type (file/folder), size, and last modified date.\n\n### search\nSearch files and folders by name, recursively.\n\n```bash\npython3 -m modules.nextcloud search contract /Clients/\n```\n\nReturns: Matching files/folders with path, type, size, and last modified date.\n\n### extract-text\nExtract readable text from one supported file.\n\n```bash\npython3 -m modules.nextcloud extract-text /Clients/contract.docx\n```\n\n### summarize\nCreate a grounded summary for one file.\n\n```bash\npython3 -m modules.nextcloud summarize /Clients/contract.docx\n```\n\n### ask-file\nAnswer a question using one file as the source.\n\n```bash\npython3 -m modules.nextcloud ask-file /Clients/contract.docx \"When is the renewal due?\"\n```\n\n### extract-actions\nExtract grounded workflow actions from one file.\n\n```bash\npython3 -m modules.nextcloud extract-actions /Clients/contract.txt\n```\n\nReturns: action items, due-date hints, owner hints, and source excerpts.\n\n### create-tasks-from-file\nPreview or create Exchange tasks from extracted file actions.\n\n```bash\npython3 -m modules.nextcloud create-tasks-from-file /Clients/contract.txt\npython3 -m modules.nextcloud create-tasks-from-file /Clients/contract.txt --select 1,2 --execute\npython3 -m modules.nextcloud create-tasks-from-file /Clients/contract.txt --mailbox user@example.com --execute\n```\n\n### upload\nUpload a local file to Nextcloud.\n\n```bash\npython3 -m modules.nextcloud upload /local/file.txt /remote/directory/\n```\n\n### download\nDownload a file from Nextcloud to local filesystem.\n\n```bash\npython3 -m modules.nextcloud download /remote/file.txt /local/directory/\n```\n\n### mkdir\nCreate a new directory on Nextcloud.\n\n```bash\npython3 -m modules.nextcloud mkdir /new/folder/path/\n```\n\n### delete\nDelete a file or directory on Nextcloud.\n\n```bash\npython3 -m modules.nextcloud delete /path/to/delete\n```\n\n### move\nMove or rename a file or directory.\n\n```bash\npython3 -m modules.nextcloud move /old/path /new/path\n```\n\n### copy\nCopy a file or directory.\n\n```bash\npython3 -m modules.nextcloud copy /source/path /destination/path\n```\n\n### info\nGet detailed information about a file or directory.\n\n```bash\npython3 -m modules.nextcloud info /path/to/item\n```\n\n### share-create\nCreate a public share link for a file or folder.\n\n```bash\npython3 -m modules.nextcloud share-create /Contracts/offer.pdf\npython3 -m modules.nextcloud share-create /Dropzones/Inbox --public-upload --expire-date 2026-04-30\n```\n\n### share-list\nList public share links, optionally filtered by path.\n\n```bash\npython3 -m modules.nextcloud share-list\npython3 -m modules.nextcloud share-list /Contracts/offer.pdf\n```\n\n### share-revoke\nRevoke a public share link by share ID.\n\n```bash\npython3 -m modules.nextcloud share-revoke 42\n```\n\n## Error Handling\n\n- Exit code 0: Success\n- Exit code 1: Missing configuration or invalid command usage\n- Exit code 3: Connection/authentication/operation error\n- Exit code 4: File or directory not found (for info-like lookups)\n\n## Notes\n\n- Nextcloud WebDAV uses user ID (not username) in paths - the script resolves this automatically\n- Search currently matches file/folder names and paths, not document content\n- `extract-text`, `summarize`, `ask-file`, `extract-actions`, and `create-tasks-from-file` operate on one file at a time\n- `create-tasks-from-file` is preview-first by default; use `--execute` to actually create Exchange tasks\n- `--select 1,2,...` lets you approve only a subset of extracted task proposals\n- PDF extraction uses `pdfplumber` (recommended, MIT license, best table/layout handling) with `pypdf` as fallback; install `pdfplumber` for best results\n- Task creation uses Exchange delegate access when `--mailbox` is supplied\n- Share-link commands use the Nextcloud OCS sharing API\n- For large files, ensure sufficient timeout settings\n- Self-signed certificates may require additional configuration\n\nFile v0.15.9:SKILL.md\n\n---\nname: nexlink\nversion: 0.15.9\ndescription: \"🔗 NexLink — Enterprise Connector for Nextcloud, Exchange & YouTube. Built by Firma de AI. Email, calendar, tasks, file management, document understanding, transcript extraction, contacts, analytics — with built-in security confirmations and least-privilege defaults.\"\nmetadata:\n  openclaw:\n    requires:\n      bins:\n        - python3\n        - pip3\n      env:\n        - EXCHANGE_SERVER\n        - EXCHANGE_USERNAME\n        - EXCHANGE_PASSWORD\n        - EXCHANGE_EMAIL\n        - OWNER_EMAIL  # Optional: recipient for notifications (defaults to EXCHANGE_EMAIL)\n        - NEXTCLOUD_URL\n        - NEXTCLOUD_USERNAME\n        - NEXTCLOUD_APP_PASSWORD\n        - NEXLINK_BRANDING  # Optional: set to 1 to enable vendor branding in outputs\n    dependencies:\n      - name: exchangelib\n        type: pip\n        version: \"==5.6.0\"\n      - name: requests-ntlm\n        type: pip\n        version: \"==1.3.0\"\n      - name: defusedxml\n        type: pip\n        version: \"==0.7.1\"\n        description: \"Secure XML parsing — fixes XXE vulnerability\"\n      - name: requests\n        type: pip\n        version: \"==2.31.0\"\n      - name: lxml\n        type: pip\n        version: \"==6.0.2\"\n      - name: pdfplumber\n        type: pip\n        version: \">=0.10.0\"\n        optional: true\n      - name: youtube-transcript-api\n        type: pip\n        version: \">=1.0.0\"\n        description: \"Document understanding features\"\n      - name: pytest\n        type: pip\n        version: \">=7.0.0\"\n        optional: true\n        description: \"Testing framework\"\n    primaryEnv: EXCHANGE_SERVER\n    skillKey: \"nextlink\"\n    emoji: \"🔗\"\n    homepage: https://github.com/asistent-alex/openclaw-nexlink\n    always: false\n    author: Firma de AI\n    links:\n      homepage: https://firmade.ai\n      repository: https://github.com/asistent-alex/openclaw-nexlink\n---\n\n# NexLink — Nextcloud, Exchange & YouTube Connector\n\n**Built by [Firma de AI](https://firmade.ai), supported by [Firma de IT](https://firmade.it).**\n\nThis skill connects Nextcloud, Exchange, and YouTube into one practical workflow layer for:\n\n- **Nextcloud**: file operations, sharing, document understanding, workflow extraction\n- **Exchange**: email, calendar, tasks, analytics\n- **YouTube**: transcript extraction with language fallback\n\n## Available Modules\n\n| Module | Description | Command |\n|--------|-------------|---------|\n| **Nextcloud** | Files, sharing, summarization, Q&A, action extraction, Contacts (CardDAV) | `nexlink files <...> \\| nexlink contacts --source nextcloud <...>` |\n| **Exchange** | Email, Calendar, Tasks, Analytics, Contacts | `nexlink <mail\\|cal\\|tasks\\|analytics\\|sync\\|contacts>` |\n| **YouTube** | Transcript extraction with language fallback | `nexlink youtube transcript\\|languages <url>` |\n\n## What it solves\n\nUse this skill when you want to work with:\n\n- Nextcloud files: listing, search, upload, download, move, sharing\n- document understanding: extract-text, summarize, ask-file\n- workflow extraction: extract actions from files and create Exchange tasks\n- YouTube transcripts: `nexlink youtube transcript <url>` (text/JSON, language fallback, save to Nextcloud)\n- emails, replies, drafts and attachments in Exchange\n- calendar, meetings and follow-up tasks\n- Exchange tasks, including delegate access\n- Contacts: Exchange contacts (EWS) and Nextcloud contacts (CardDAV)\n\n## Quick Start\n\n### Email\n\n```bash\n# Connection\nnexlink mail connect\n\n# List emails\nnexlink mail read --limit 10\nnexlink mail read --unread\n\n# Send email\nnexlink mail send --to \"client@example.com\" --subject \"Offer\" --body \"...\"\n\n# Reply\nnexlink mail reply --id EMAIL_ID --body \"Reply\"\n```\n\n### Calendar\n\n```bash\n# Events\nnexlink cal today\nnexlink cal week\nnexlink cal list --days 7\n\n# Create event\nnexlink cal create --subject \"Meeting\" --start \"2024-01-15 14:00\" --duration 60\n\n# With attendees\nnexlink cal create --subject \"Team Meeting\" --start \"2024-01-15 14:00\" --to \"user1@example.com,user2@example.com\"\n```\n\n### Tasks\n\n```bash\n# List\nnexlink tasks list\nnexlink tasks list --overdue\n\n# Create\nnexlink tasks create --subject \"Review proposal\" --due \"+7d\" --priority high\n\n# Complete\nnexlink tasks complete --id TASK_ID\n```\n\n### Analytics (Email Statistics)\n\n```bash\n# General statistics\nnexlink analytics stats --days 30\n\n# Average response time\nnexlink analytics response-time --days 7\n\n# Top senders\nnexlink analytics top-senders --limit 20\n\n# Activity heatmap\nnexlink analytics heatmap --days 30\n\n# Statistics per folder\nnexlink analytics folders\n\n# Full report\nnexlink analytics report --days 30\n```\n\n### Contacts\n\n```bash\n# Exchange contacts (default source)\nnexlink contacts list\nnexlink contacts list --limit 10\n\n# Get Exchange contact by ID\nnexlink contacts get --id CONTACT_ID\n\n# Create Exchange contact\nnexlink contacts create --name \"John Doe\" --email \"john@example.com\" --phone \"+40-700-000-000\"\nnexlink contacts create --name \"Acme Corp\" --phone \"+40-711-111-111\" --org \"Acme\" --title \"CEO\"\n\n# Update Exchange contact\nnexlink contacts update --id CONTACT_ID --phone \"+40-722-222-222\"\n\n# Delete Exchange contact (moves to trash)\nnexlink contacts delete --id CONTACT_ID\n\n# Search contacts\nnexlink contacts search --query \"Acme\"\n\n# Nextcloud contacts (CardDAV — use --source nextcloud)\nnexlink contacts addressbooks --source nextcloud\nnexlink contacts list --source nextcloud\nnexlink contacts list --source nextcloud --addressbook \"/remote.php/dav/addressbooks/users/alex/contacts/\"\n\n# Get Nextcloud contact by UID\nnexlink contacts get --uid CONTACT_UID --source nextcloud\n\n# Create Nextcloud contact\nnexlink contacts create --source nextcloud --name \"Jane Doe\" --email \"jane@example.com\" --phone \"+40-733-333-333\"\n\n# Update Nextcloud contact\nnexlink contacts update --uid CONTACT_UID --source nextcloud --phone \"+40-744-444-444\"\n\n# Delete Nextcloud contact\nnexlink contacts delete --uid CONTACT_UID --source nextcloud\n```\n\n### Files (Nextcloud)\n\n```bash\n# List and search\nnexlink files list /Documents/\nnexlink files search contract /Clients/\n\n# Upload / Download\nnexlink files upload /local/report.pdf /Documents/\nnexlink files download /Documents/report.pdf /local/\n\n# Document understanding\nnexlink files extract-text /Clients/contract.docx\nnexlink files summarize /Clients/contract.docx\nnexlink files ask-file /Clients/contract.docx \"When is the renewal due?\"\n\n# Workflow extraction\nnexlink files extract-actions /Clients/contract.txt\nnexlink files create-tasks-from-file /Clients/contract.txt\nnexlink files create-tasks-from-file /Clients/contract.txt --select 1,2 --execute\n\n### YouTube Transcripts\n\nExtract video subtitles with automatic language fallback:\n\n```bash\n# Basic text transcript (English)\nnexlink youtube transcript https://www.youtube.com/watch?v=VIDEO_ID\n\n# Romanian transcript with JSON output (includes timestamps)\nnexlink youtube transcript https://youtu.be/VIDEO_ID --lang ro --format json\n\n# Try multiple languages, fall back in order\nnexlink youtube transcript VIDEO_ID --lang ro,en\n\n# Save transcript to Nextcloud\nnexlink youtube transcript VIDEO_ID --lang en --save\n\n# List available caption languages\nnexlink youtube languages https://www.youtube.com/watch?v=VIDEO_ID\n```\n\n**Note:** Requires `pip install youtube-transcript-api` for the underlying library.\n\n## Combined Workflows\n\n### Email + Files\n\nSend email with attachment from Nextcloud:\n\n```bash\n# Download from Nextcloud and send\nnexlink files download /Documents/offer.pdf /tmp/\nnexlink mail send --to \"client@example.com\" --subject \"Offer\" --body \"...\" --attach /tmp/offer.pdf\n```\n\nSave attachment from email to Nextcloud:\n\n```bash\n# Download attachment and upload to Nextcloud\nnexlink mail download-attachment --id EMAIL_ID --name \"contract.pdf\" --output /tmp/\nnexlink files upload /tmp/contract.pdf /Contracts/\n```\n\n### Calendar + Tasks\n\nCreate task from meeting request:\n\n```bash\n# After meeting, create follow-up task\nnexlink tasks create --subject \"Follow-up meeting X\" --due \"+3d\"\n```\n\n## Full Configuration\n\nSee [references/setup.md](references/setup.md) for detailed configuration.\n\n## Positioning public / branding\n\nFor public listings, documentation, and SEO copy, prefer this positioning:\n\n- **Public title:** `Firma de AI — Exchange & Nextcloud Assistant`\n- **Subtitle:** `Email, files, tasks, and document workflows for teams`\n- **Brand line:** `Built by Firma de AI, supported by Firma de IT.`\n- **Links:** `https://firmade.ai` and `https://firmade.it`\n\nThis keeps the internal skill name `nexlink` while making the public positioning more accurate and searchable.\n\n## Coding Standards\n\nThis project follows the [Hardshell Coding Standards](https://github.com/asistent-alex/openclaw-hardshell).\n\nWhen writing or modifying Python code, see:\n- **[Python Standards](https://github.com/asistent-alex/openclaw-hardshell/blob/main/references/languages/python.md)** - PEP 8, type hints, docstrings, security\n- **[Testing Standards](https://github.com/asistent-alex/openclaw-hardshell/blob/main/references/testing.md)** - TDD, test pyramid, coverage\n- **[Git Workflow](https://github.com/asistent-alex/openclaw-hardshell/blob/main/references/git-workflow.md)** - Conventional commits, PR process\n\nKey rules:\n\n- **PEP 8 formatting** - use `black` for formatting, `ruff` for linting\n- **Type hints** - required for all function parameters and return types\n- **Docstrings** - Google-style for all public functions and classes\n- **Testing** - `pytest` with `pytest-cov` for coverage\n- **Security** - never use `pickle` or `eval()` on untrusted input\n- **Dependencies** - use `uv` or `poetry`, pin versions, audit with `pip-audit`\n\n## Module Structure\n\n```\nmodules/\n├── exchange/           # Email, Calendar, Tasks (Exchange on-prem)\n│   ├── SKILL.md       # Module documentation\n│   ├── mail.py        # Email operations\n│   ├── cal.py         # Calendar operations\n│   ├── tasks.py       # Task operations\n│   ├── sync.py        # Sync and reminders\n│   └── ...\n├── nextcloud/          # File management, doc understanding, workflow extraction\n│   ├── SKILL.md       # Module documentation\n│   └── nextcloud.py   # File operations and analysis\n└── (future modules)\n```\n\n## Notes\n\n- Tasks are created in the default mailbox's Tasks folder or in the target mailbox when using delegate access\n- For collaborative tasks, use calendar events with attendees\n- Self-signed certificates require `verify_ssl: false`\n\n## License\n\nMIT License - see LICENSE file for details.\n\nFile v0.15.9:README.md\n\n<div align=\"center\">\n\n# 🔗 NexLink — Enterprise Connector for Nextcloud, Exchange & YouTube\n\n**Email, calendar, tasks, file management, document understanding, transcript extraction, contacts, and analytics**\n\n**Built by [Firma de AI](https://firmade.ai) · Supported by [Firma de IT](https://firmade.it)**\n\n[![Version](https://img.shields.io/badge/version-0.15.2-blue.svg)](https://github.com/asistent-alex/openclaw-nexlink)\n[![License: MIT-0](https://img.shields.io/badge/License-MIT--0-yellow.svg)](https://opensource.org/licenses/MIT)\n[![OpenClaw Skill](https://img.shields.io/badge/OpenClaw-Skill-green.svg)](https://clawhub.ai/asistent-alex/nexlink)\n[![Python 3.10+](https://img.shields.io/badge/python-3.10%2B-brightgreen.svg)](https://www.python.org/)\n[![Tests](https://img.shields.io/badge/tests-48%2F48%20passed-brightgreen.svg)](https://github.com/asistent-alex/openclaw-nexlink/actions)\n[![ClawHub](https://img.shields.io/badge/clawhub-nexlink-8A2BE2.svg)](https://clawhub.ai/asistent-alex/nexlink)\n[![Hardshell](https://img.shields.io/badge/code%20style-Hardshell-ff69b4.svg)](https://github.com/asistent-alex/openclaw-hardshell)\n[![GitHub](https://img.shields.io/badge/GitHub-Repo-181717.svg?logo=github)](https://github.com/asistent-alex/openclaw-nexlink)\n[![Security](https://img.shields.io/badge/security-audited-brightgreen.svg)](https://github.com/asistent-alex/openclaw-nexlink/blob/main/SECURITY.md)\n\n</div>\n\n---\n\n**NexLink** connects Nextcloud, Microsoft Exchange, and YouTube into one enterprise-grade workflow layer — with built-in security confirmations and least-privilege defaults.\n\n> **Public positioning:** *Firma de AI — Nextcloud, Exchange & YouTube Assistant*  \n> **CLI name:** `nexlink` · **Version:** `v0.15.2` · **License:** `MIT-0`\n\n### 🔗 Official Links\n\n| Resource | URL |\n|----------|-----|\n| 🏠 **Homepage** | [firmade.ai](https://firmade.ai) |\n| 📦 **GitHub Repository** | [github.com/asistent-alex/openclaw-nexlink](https://github.com/asistent-alex/openclaw-nexlink) |\n| 📋 **ClawHub Listing** | [clawhub.ai/asistent-alex/nexlink](https://clawhub.ai/asistent-alex/nexlink) |\n| 📖 **Documentation** | [github.com/asistent-alex/openclaw-nexlink#readme](https://github.com/asistent-alex/openclaw-nexlink#readme) |\n| 🔒 **Security Policy** | [github.com/asistent-alex/openclaw-nexlink/blob/main/SECURITY.md](https://github.com/asistent-alex/openclaw-nexlink/blob/main/SECURITY.md) |\n| 📝 **Changelog** | [github.com/asistent-alex/openclaw-nexlink/blob/main/CHANGELOG.md](https://github.com/asistent-alex/openclaw-nexlink/blob/main/CHANGELOG.md) |\n| 🐛 **Issues** | [github.com/asistent-alex/openclaw-nexlink/issues](https://github.com/asistent-alex/openclaw-nexlink/issues) |\n| 🔄 **Releases** | [github.com/asistent-alex/openclaw-nexlink/releases](https://github.com/asistent-alex/openclaw-nexlink/releases) |\n\n---\n\n## What it does\n\nThis skill connects Nextcloud, Exchange, and YouTube into one practical workflow layer for:\n\n- **Files** — list, search, upload, download, move, copy, info, sharing\n- **Document understanding** — extract text, summarize, ask questions about one file\n- **Workflow extraction** — extract actions from documents and create Exchange tasks\n- **YouTube** — transcript extraction with language fallback, text/JSON output, save to Nextcloud\n- **Email** — read, send, draft, reply, forward, attachments\n- **Calendar** — today, week, list, create, update, respond\n- **Tasks** — list, create, complete, trash, delegate workflows\n- **Sync & Reminders** — task sync with Exchange, email reminders, calendar linking\n- **Analytics** — inbox stats, response time, top senders, heatmap, reports\n\n## Why this is useful\n\nUse it when a team already works in **Nextcloud**, **Microsoft Exchange** and wants one assistant layer for:\n\n- file operations and sharing\n- turning documents into action items\n- extracting YouTube transcripts for meetings and research\n- inbox and follow-up workflows\n- meeting and task coordination\n\nBuilt by [Firma de AI](https://firmade.ai), supported by [Firma de IT](https://firmade.it).\n\n## Quick start\n\n### Current CLI name\n\nAfter installation, the command remains:\n\n```bash\nnexlink\n```\n\n### Typical first checks\n\n```bash\nnexlink mail connect\nnexlink files list /\nnexlink mail read --limit 5\nnexlink cal today\nnexlink tasks list\nnexlink analytics stats --days 7\nnexlink sync status\n```\n\n## Main capabilities\n\n### Exchange — Email, Calendar, Tasks, Analytics\n\nFull Exchange on-premises (2016/2019) workflows over EWS.\n\n| What you can do | Command |\n|---|---|\n| Read email | `nexlink mail read` · `nexlink mail read --unread` · `nexlink mail get --id X` |\n| Send email | `nexlink mail send --to x@y.com --subject \"Hello\" --body \"...\"` |\n| Reply / forward | `nexlink mail reply --id EMAIL_ID --body \"...\"` · `nexlink mail forward --id EMAIL_ID --to other@example.com` |\n| Download attachment | `nexlink mail download-attachment --id EMAIL_ID --name file.pdf` |\n| Mark unread mail as read | `nexlink mail mark-all-read` |\n| Today / week calendar | `nexlink cal today` · `nexlink cal week` |\n| Create meeting | `nexlink cal create --subject \"Meeting\" --start \"2026-04-20 14:00\" --duration 60` |\n| Create task | `nexlink tasks create --subject \"Follow-up\" --due \"+7d\" --priority high` |\n| List delegated tasks | `nexlink tasks list --mailbox coleg@firma.ro` |\n| Complete / trash task | `nexlink tasks complete --id TASK_ID` · `nexlink tasks trash --id TASK_ID` |\n| Create contact | `nexlink contacts create --name \"Jane Doe\" --email \"jane@example.com\"` |\n| Update contact | `nexlink contacts update --id CONTACT_ID --phone \"+40-722-000-000\"` |\n| Delete contact | `nexlink contacts delete --id CONTACT_ID` |\n| Search contacts | `nexlink contacts search --query \"Acme\"` |\n| Sync tasks | `nexlink sync sync` · `nexlink sync status` |\n| Send reminders | `nexlink sync reminders --hours 24` · `nexlink sync reminders --hours 24 --to owner@example.com` |\n| Link calendar event | `nexlink sync link-calendar --task-id TASK_ID` |\n| Inbox analytics | `nexlink analytics stats --days 30` |\n| Response time | `nexlink analytics response-time --days 7` |\n| Top senders | `nexlink analytics top-senders --limit 20` |\n| Activity heatmap | `nexlink analytics heatmap --days 30` |\n| Folder stats | `nexlink analytics folders` |\n| Full report | `nexlink analytics report --days 30` |\n\n> Delegate workflows are supported where Exchange permissions allow them.\n\n### Nextcloud — Files, Sharing, Document Understanding\n\nNextcloud workflows over WebDAV and OCS APIs.\n\n| What you can do | Command |\n|---|---|\n| List files | `nexlink files list /Documents/` |\n| Search files | `nexlink files search contract /Clients/` |\n| Upload / download | `nexlink files upload /local/report.pdf /Documents/` · `nexlink files download /Documents/report.pdf /tmp/` |\n| Create / move / copy | `nexlink files mkdir /Documents/New` · `nexlink files move /old /new` · `nexlink files copy /src /dst` |\n| File info | `nexlink files info /Documents/report.pdf` |\n| Shared items | `nexlink files shared` · `nexlink files share-list` |\n| List contacts | `nexlink contacts list --source nextcloud` |\n| Get contact | `nexlink contacts get --uid CONTACT_UID --source nextcloud` |\n| Create contact | `nexlink contacts create --source nextcloud --name \"Jane\" --email \"j@e.com\"` |\n| Update contact | `nexlink contacts update --uid CONTACT_UID --source nextcloud --phone \"...\"` |\n| Delete contact | `nexlink contacts delete --uid CONTACT_UID --source nextcloud` |\n| Search contacts | `nexlink contacts search --source nextcloud --query \"Jane\"` |\n| Create public links | `nexlink files share-create /Contracts/offer.pdf` |\n| Delete file / folder | `nexlink files delete /Documents/old` |\n| Extract text | `nexlink files extract-text /Clients/contract.docx` |\n| Summarize a file | `nexlink files summarize /Clients/contract.docx` |\n| Ask a file | `nexlink files ask-file /Clients/contract.docx \"When is the renewal due?\"` |\n| Extract actions | `nexlink files extract-actions /Clients/contract.txt` |\n| Create tasks from file | `nexlink files create-tasks-from-file /Clients/contract.txt --select 1,2 --execute` |\n\n### YouTube — Transcript Extraction\n\nExtract video captions/subtitles with automatic language fallback:\n\n| What you can do | Command |\n|---|---|\n| Get transcript (text) | `nexlink youtube transcript <url>` |\n| Get transcript (JSON) | `nexlink youtube transcript <url> --format json` |\n| Language fallback | `nexlink youtube transcript <url> --lang ro,en` |\n| Save to Nextcloud | `nexlink youtube transcript <url> --save` |\n| List available languages | `nexlink youtube languages <url>` |\n\nSupports all YouTube URL formats (watch, youtu.be, shorts, embed) and raw video IDs.\n\n### Combined workflows\n\n#### Send a Nextcloud file by email\n\n```bash\nnexlink files download /Documents/offer.pdf /tmp/\nnexlink mail send --to \"client@example.com\" --subject \"Offer\" --body \"Please see attached.\" --attach /tmp/offer.pdf\n```\n\n#### Save an email attachment into Nextcloud\n\n```bash\nnexlink mail download-attachment --id EMAIL_ID --name \"contract.pdf\" --output /tmp/\nnexlink files upload /tmp/contract.pdf /Contracts/\n```\n\n#### Turn a document into follow-up tasks\n\n```bash\nnexlink files extract-actions /Clients/contract.txt\nnexlink files create-tasks-from-file /Clients/contract.txt --select 1,2 --execute\n```\n\n## Configuration\n\n### Exchange\n\n```bash\nexport EXCHANGE_SERVER=\"https://mail.your-domain.com/EWS/Exchange.asmx\"\nexport EXCHANGE_USERNAME=\"service-account\"\nexport EXCHANGE_PASSWORD=\"your-password\"\nexport EXCHANGE_EMAIL=\"service-account@your-domain.com\"\nexport OWNER_EMAIL=\"owner@your-domain.com\"  # Optional: recipient for notifications (defaults to EXCHANGE_EMAIL)\nexport EXCHANGE_VERIFY_SSL=\"false\"   # only for self-signed certificates\n```\n\n### Nextcloud\n\n```bash\nexport NEXTCLOUD_URL=\"https://cloud.your-domain.com\"\nexport NEXTCLOUD_USERNAME=\"your-username\"\nexport NEXTCLOUD_APP_PASSWORD=\"your-app-password\"\n```\n\nFor full setup details, see [references/setup.md](references/setup.md).\n\n## Changelog\n\nSee [CHANGELOG.md](CHANGELOG.md) for the full version history. Latest: v0.14.1.\n\n## Installation options\n\n### From Git\n\n```bash\ncd ~/.openclaw/skills/\ngit clone https://github.com/asistent-alex/openclaw-nexlink.git\ncd openclaw-nexlink\npip3 install -r requirements.txt\n```\n\n### From ClawHub\n\nUse the published listing/slug once the public package is live on ClawHub. The public title is intended to be:\n\n**Firma de AI — Nextcloud, Exchange & YouTube Assistant**\n\nThe CLI command remains:\n\n```bash\nnexlink\n```\n\n## Brand positioning\n\nFor public listings, release notes, and marketing copy, prefer:\n\n- **Title:** Firma de AI — Nextcloud, Exchange & YouTube Assistant\n- **Subtitle:** Email, files, tasks, transcripts, and document workflows for teams\n- **Brand line:** Built by Firma de AI, supported by Firma de IT.\n- **Links:** https://firmade.ai · https://firmade.it\n\n## License\n\nMIT — see [LICENSE](LICENSE).\n\nThis project follows the [Hardshell Coding Standards](https://github.com/asistent-alex/openclaw-hardshell).\n\n---\n\n<div align=\"center\">\n\n**Built by [Firma de AI](https://firmade.ai), supported by [Firma de IT](https://firmade.it)**  \n*Nextcloud, Exchange, YouTube — one assistant.*\n\n[Hardshell](https://github.com/asistent-alex/openclaw-hardshell) · [prompt-to-pr](https://github.com/asistent-alex/openclaw-prompt-to-pr) · [Report Bug](https://github.com/asistent-alex/openclaw-nexlink/issues) · [Request Feature](https://github.com/asistent-alex/openclaw-nexlink/issues)\n\n</div>\n\nFile v0.15.9:_meta.json\n\n{\n  \"ownerId\": \"kn79j1bsq3gg7dhe829cx763g983x4dy\",\n  \"slug\": \"nexlink\",\n  \"version\": \"0.15.9\",\n  \"publishedAt\": 1777663365265\n}\n\nFile v0.15.9:references/security-best-practices.md\n\n# Security Best Practices for NexLink\n\n## Dedicated Least-Privilege Accounts\n\n### Exchange\n\n**DO NOT use personal accounts.** Use a dedicated service account with minimal permissions:\n\n1. **Create a dedicated Exchange mailbox** (e.g., `nexlink-svc@your-domain.com`)\n2. **Grant delegate access** only to the specific folders NexLink needs:\n   - Inbox (read/send)\n   - Calendar (read/write)\n   - Tasks (read/write)\n   - Contacts (read/write)\n3. **Avoid using an account with Domain Admin privileges**\n4. **Enable MFA on the service account** and use an app password for NexLink\n\n### Nextcloud\n\n**DO NOT use your personal Nextcloud account.** Create a dedicated user with scoped permissions:\n\n1. **Create a dedicated Nextcloud user** (e.g., `nexlink`)\n2. **Grant access only to specific group folders**:\n   ```bash\n   # Example: allow access only to /NexLink folder\n   # Set up via Nextcloud admin panel → Group Folders\n   ```\n3. **Generate an app password** — never use the main password\n4. **Restrict to WebDAV/CardDAV endpoints only**\n\n### Credential Rotation\n\n| Credential | Rotation Frequency |\n|------------|-------------------|\n| Exchange app password | Every 90 days |\n| Nextcloud app password | Every 90 days |\n| Exchange service account password | Every 180 days |\n\n## Environment Variable Security\n\n**NEVER commit credentials to version control.** Use one of these patterns:\n\n```bash\n# Option 1: Export in shell profile (secure on single-user systems)\nexport EXCHANGE_PASSWORD=\"...\"   # ~/.bashrc or ~/.zshrc\n\n# Option 2: Use OpenClaw secrets management (recommended)\n# Store in OpenClaw vault and reference as ${EXCHANGE_PASSWORD}\n\n# Option 3: Use a secrets manager (HashiCorp Vault, 1Password CLI, etc.)\nexport EXCHANGE_PASSWORD=\"$(op read 'op://vault/item/password')\"\n```\n\n**Check for credential leaks:**\n```bash\ngrep -rn \"EXCHANGE_PASSWORD\\|NEXTCLOUD_APP_PASSWORD\" ~/.openclaw/skills/nexlink/ --include=\"*.py\" --include=\"*.md\"\n# Should only appear in config.template.yaml (with placeholder values) and documentation\n```\n\n## Confirmation Prompts\n\nAll destructive operations require confirmation. To run a single operation in automation:\n\n```bash\nnexlink mail send --to \"client@example.com\" --subject \"...\" --yes\n```\n\n**Warning:** `--yes` / `-y` bypasses confirmation for **only that one command**. For multiple operations, add `--yes` to each one.\n\n## Branding Opt-Out\n\nTo suppress \"Built by Firma de AI\" in generated outputs:\n\n```bash\n# CLI flag\nnexlink --no-branding analytics report --days 30\n\n# Environment variable\nexport NEXLINK_NO_BRANDING=1\n```\n\n## Audit Trail\n\nEnable logging for accountability:\n\n```bash\n# Set log level for NexLink operations\nexport NEXLINK_LOG_LEVEL=INFO    # DEBUG, INFO, WARNING, ERROR\n```\n\nLogs are written to `~/.openclaw/skills/nexlink/logs/nexlink.log`.\n\n## Memory / Persistence\n\nNexLink uses the LCM (Lossless Context Memory) plugin for persistent context.\n\n**What gets stored:**\n- Command history\n- File metadata (names, paths, sizes)\n- Task/calendar IDs (for follow-up operations)\n- Contact IDs\n- **NOT** raw email content, file contents, or passwords\n\n**How to clear:**\n```bash\n# Clear all NexLink memory (requires confirmation)\nnexlink memory clear --yes\n\n# Alternative: use the built-in reset command\nnexlink memory reset --confirm\n```\n\n**⚠️ Always use `--yes` or `--confirm` for destructive operations.**\n\n**To opt out of persistent memory:**\n```bash\nexport NEXLINK_NO_MEMORY=1\n```\n\n## Reporting Security Issues\n\nSee [SECURITY.md](../SECURITY.md) for vulnerability reporting.\n\n---\n\n_Last updated: 2026-04-30_\n\nFile v0.15.9:references/setup.md\n\n# NexLink Setup Guide\n\nGhid practic de instalare, configurare și verificare pentru skill-ul NexLink.\n\n## Cuprins\n\n1. [Cerințe de sistem](#cerințe-de-sistem)\n2. [Instalare](#instalare)\n3. [Configurare Exchange](#configurare-exchange)\n4. [Configurare Nextcloud](#configurare-nextcloud)\n5. [Verificare rapidă](#verificare-rapidă)\n6. [Troubleshooting](#troubleshooting)\n\n## Cerințe de sistem\n\n- Python 3.10+\n- OpenClaw instalat și configurat\n- Exchange Server 2016/2019 (on-premises) pentru modulele Exchange\n- Nextcloud pentru modulul `files`\n- Acces de rețea la serviciile de mai sus\n\n## Instalare\n\n### Varianta recomandată: prin ClawHub\n\n```bash\nclawhub install nexlink\n```\n\n### Varianta manuală: din Git\n\n```bash\ncd ~/.openclaw/skills/\ngit clone https://github.com/asistent-alex/openclaw-nexlink.git\ncd openclaw-nexlink\npip install -r requirements.txt\n```\n\n## Configurare Exchange\n\n### Variabile de mediu\n\n```bash\nexport EXCHANGE_SERVER=\"https://mail.your-domain.com/EWS/Exchange.asmx\"\nexport EXCHANGE_USERNAME=\"service-account\"\nexport EXCHANGE_PASSWORD=\"your-password\"\nexport EXCHANGE_EMAIL=\"service-account@your-domain.com\"\nexport EXCHANGE_VERIFY_SSL=\"false\"   # doar pentru certificate self-signed\n```\n\n### Fișier de configurare\n\nPoți folosi și `config.yaml` în rădăcina skill-ului:\n\n```yaml\nexchange:\n  server: https://mail.your-domain.com/EWS/Exchange.asmx\n  username: ${EXCHANGE_USERNAME}\n  password: ${EXCHANGE_PASSWORD}\n  email: service-account@your-domain.com\n  verify_ssl: false\n```\n\n### Verificare Exchange\n\n```bash\nnexlink mail connect\nnexlink cal today\nnexlink tasks list\n```\n\n## Configurare Nextcloud\n\n### Variabile de mediu\n\n```bash\nexport NEXTCLOUD_URL=\"https://cloud.your-domain.com\"\nexport NEXTCLOUD_USERNAME=\"your-username\"\nexport NEXTCLOUD_APP_PASSWORD=\"your-app-password\"\n```\n\n### Cum obții un App Password\n\n1. Intră în Nextcloud\n2. Mergi la **Settings → Security → Devices & sessions**\n3. Creează un nou **app password**\n4. Folosește parola generată în `NEXTCLOUD_APP_PASSWORD`\n\n### Verificare Nextcloud\n\n```bash\nnexlink files list /\nnexlink files search contract /Clients/\nnexlink files summarize /Clients/contract.docx\nnexlink files extract-actions /Clients/contract.txt\n```\n\n## Verificare rapidă\n\nRulează din repo sau după instalarea CLI-ului:\n\n```bash\n# Exchange\nnexlink mail connect\nnexlink mail read --limit 5\nnexlink cal today\nnexlink tasks list\nnexlink analytics stats --days 7\n\n# Nextcloud\nnexlink files list /\nnexlink files search contract /Clients/\nnexlink files extract-text /Clients/contract.docx\nnexlink files summarize /Clients/contract.docx\nnexlink files ask-file /Clients/contract.docx \"When is the renewal due?\"\nnexlink files extract-actions /Clients/contract.txt\nnexlink files create-tasks-from-file /Clients/contract.txt\nnexlink files share-list\nnexlink files shared\n```\n\n### Observație importantă despre task-uri\n\nPentru task-uri, comanda sigură de eliminare este:\n\n```bash\nnexlink tasks trash --id TASK_ID\n```\n\nNu documenta `tasks delete` pentru Exchange tasks în acest repo.\n\n## Troubleshooting\n\n### Exchange SSL error\n\n```text\nSSL: CERTIFICATE_VERIFY_FAILED\n```\n\n**Soluție:** setează `EXCHANGE_VERIFY_SSL=\"false\"` doar dacă folosești certificate self-signed.\n\n### Exchange authentication failed\n\n```text\nUnauthorized\n```\n\nVerifică:\n1. username-ul\n2. parola\n3. că mailbox-ul există și are accesul necesar\n\n### Nextcloud 401 Unauthorized\n\n```text\n401 Unauthorized\n```\n\nVerifică:\n1. URL-ul complet (`https://...`)\n2. username-ul\n3. app password-ul, nu parola principală\n\n### Module import / path issues\n\nDacă rulezi direct din repo și ai probleme de path, folosește entrypoint-ul unificat:\n\n```bash\ncd ~/.openclaw/skills/openclaw-nexlink\npython3 scripts/nexlink.py mail connect\n```\n\nsau, dacă scriptul este instalat în PATH:\n\n```bash\nnexlink mail connect\n```\n\n## Configurație completă exemplu\n\n```yaml\nexchange:\n  server: https://mail.your-domain.com/EWS/Exchange.asmx\n  username: service-account\n  password: ${EXCHANGE_PASSWORD}\n  email: service-account@your-domain.com\n  verify_ssl: false\n\nnextcloud:\n  url: https://cloud.your-domain.com\n  username: your-username\n  app_password: ${NEXTCLOUD_APP_PASSWORD}\n```\n\nFile v0.15.9:ABOUT.md\n\n# About NexLink\n\n## What is NexLink?\n\nNexLink is an OpenClaw skill that connects **Microsoft Exchange** and **Nextcloud** into one practical workflow layer. It gives teams a single assistant interface for email, calendar, tasks, file management, and document understanding.\n\n## Built for Teams That Use Exchange + Nextcloud\n\nIf your organization runs **Microsoft Exchange** (on-premises or hybrid) and **Nextcloud** for file storage, NexLink eliminates the context switching between mail client, calendar, task manager, and file browser.\n\n## What You Can Do\n\n| Area | Actions |\n|------|---------|\n| **Email** | Read, send, draft, reply, forward, download attachments |\n| **Calendar** | View today/week, create meetings, respond to invites |\n| **Tasks** | List, create, complete, trash — including delegate workflows |\n| **Analytics** | Inbox stats, response time, top senders, heatmaps |\n| **Files** | List, search, upload, download, move, copy, share |\n| **Documents** | Extract text, summarize, ask questions, extract action items |\n\n## Key Workflows\n\n- **Send a Nextcloud file by email** — download from Nextcloud, attach to Exchange email\n- **Save email attachments to Nextcloud** — download from Exchange, upload to Nextcloud\n- **Turn documents into tasks** — extract action items from contracts, create Exchange tasks\n- **Delegate task management** — manage tasks for team members with proper Exchange permissions\n\n## How It Works\n\nNexLink uses:\n- **EWS (Exchange Web Services)** for Exchange operations\n- **WebDAV + OCS APIs** for Nextcloud file operations\n- **OpenClaw skill framework** for integration with the assistant layer\n\n## Requirements\n\n- Python 3.10+\n- Exchange Server 2016/2019 (on-premises) or hybrid\n- Nextcloud instance with app password access\n- Network access to both services\n\n## Brand\n\n**Built by [Firma de AI](https://firmade.ai), supported by [Firma de IT](https://firmade.it).**\n\n## License\n\nMIT — see [LICENSE](LICENSE).\n\nFile v0.15.9:BRAND.md\n\n# Brand Guidelines — NexLink\n\n_All assets, messages, and outputs from this project must follow these rules._\n\n## Branding Opt-In (Privacy-First)\n\n**Branding is OFF by default** for all outputs. This protects user privacy and prevents unintended disclosure of vendor information in business communications.\n\n**To enable branding:**\n- Env: `export NEXLINK_BRANDING=1`\n- Agent config: set `NEXLINK_BRANDING=1` in environment\n\nWhen branding is enabled, outputs may include firmade.ai / firmade.it links or \"Built by Firma de AI\" text.\n\n---\n\n## 1. Brand Line (Optional)\n\nWhen branding is **enabled**, the following line may be included:\n\n**EN:**\n\n> Built by [Firma de AI](https://firmade.ai), supported by [Firma de IT](https://firmade.it)\n\n**RO:**\n\n> Construit de [Firma de AI](https://firmade.ai), susținut de [Firma de IT](https://firmade.it)\n\nAceastă frază **poate** apărea în (doar când branding e activat):\n- README.md (subtitlu + footer)\n- Email digests (header + footer)\n- Orice output public (rapoarte, pagini, documentație)\n\n### Reguli\n\n1. **Întotdeauna cu link-uri** — Numele firmei e mereu hyperlink, niciodată text gol.\n2. **Fără `www.`** — `https://firmade.ai` și `https://firmade.it`, niciodată cu `www.`\n3. **Ordinea e fixă** — Firma de AI primează (built by), Firma de IT urmează (supported by).\n4. **Nu inversa rolurile** — Firma de AI = build/develop/create, Firma de IT = support/infrastructure/backing.\n5. **Nu alterna sinonime** — Nu folosi \"made by\", \"created by\", \"powered by\" etc. Stick to \"built by\" și \"supported by\".\n\n---\n\n## 2. Tagline-ul Produsului\n\n**EN:**\n\n> Exchange, Nextcloud, GitHub — one assistant.\n\nAceasta e headline-ul produsului. Menționează mereu cele 3 integrări principale.\n\n### Variante permise\n\n| Context | Variantă |\n|---------|----------|\n| README header | Exchange, Nextcloud, GitHub — one assistant. Built by Firma de AI, supported by Firma de IT |\n| Email digest | GitHub Releases Digest — Built for teams using Firma de AI and supported by Firma de IT |\n| Footer scurt | Built by Firma de AI · Supported by Firma de IT · Made with ☕ in România |\n| Social/bio | OpenClaw skill for Romanian SMEs — Exchange, Nextcloud, GitHub in one assistant |\n\n---\n\n## 3. Numele Firmelor\n\n| Firmă | URL | Rol în brand line |\n|-------|-----|-------------------|\n| **Firma de AI** | https://firmade.ai | built by (creator, dezvoltator) |\n| **Firma de IT** | https://firmade.it | supported by (infrastructură, suport) |\n\n### Formate greșite ❌\n\n- `www.firmade.ai` / `www.firmade.it`\n- `Firma De AI` / `FIRMA DE IT`\n- `firma de ai` / `firma de it` (lowercase, cu excepția URL-urilor)\n- `FirmadeAI` / `FirmadeIT` (fără spațiu)\n\n---\n\n## 4. Culori Brand\n\n| Element | Culoare | Hex |\n|---------|---------|-----|\n| Firma de AI badge | Indigo | `#6366f1` |\n| Firma de IT badge | Sky blue | `#0ea5e9` |\n| Email hero (updates) | Blue | `#1d4ed8` |\n| Email hero (no updates) | Teal | `#134e4a` |\n| Email hero (errors) | Dark red | `#7f1d1d` |\n| Card background | White | `#ffffff` |\n| Page background | Light gray | `#f4f6f8` |\n\n---\n\n## 5. Email Digest Branding\n\n### Header\n\n- Brand line cu link-uri către ambele firme\n- Hero section cu background adaptiv (teal/blue/red după status)\n- \"Useful AI intelligence for Romanian teams\" ca subtitlu\n\n### Footer\n\n- \"Generated by NexLink MSP GitHub checker\" + link GitHub repo\n- Link Firma de AI + link Firma de IT\n- Separator vizual (border-top 3px)\n\n### Reguli email\n\n- **Outlook-compatible HTML** — tabele cu `role=\"presentation\"`, inline styles, fără CSS classes\n- **Fără JavaScript** — emailul trebuie să funcționeze fără scripting\n- **Dark/light adaptiv** — hero-ul se schimbă după status, dar textul rămâne lizibil\n\n---\n\n## 6. Tone of Voice\n\n- **RO pentru utilatori români**, EN pentru documentație tehnică\n- Practic, direct, fără hype gol\n- \"Made with ☕ in România\" e un touch permis — nu overdo it\n- Evită superlative goale: \"revolutionar\", \"uimitor\", \"incredibil\"\n- Fii specific: în loc de \"performanță excelentă\", scrie \"răspuns sub 2 secunde\"\n\n---\n\n## 7. Checklist pentru Output Nou\n\nOrice output public (email, raport, pagină, README) trebuie să verifice:\n\n- [ ] Brand line prezentă cu link-uri corecte (fără `www.`)\n- [ ] Ordinea corectă: Firma de AI → Firma de IT\n- [ ] Tagline-ul produsului menționează integrările (Exchange, Nextcloud, GitHub)\n- [ ] Culorile respectă paleta de mai sus\n- [ ] Email HTML e Outlook-compatible\n- [ ] Numele firmelor sunt corect capitalizate\n\n---\n\n_This document is the source of truth for all branding decisions in NexLink._\n_Last updated: 2026-04-09_\n\nFile v0.15.9:CHANGELOG.md\n\n# Changelog\n\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),\nand this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n\n## [0.15.9] - 2026-05-01\n\n### Security (ClawScan Findings — All Phases)\n\n**Phase 1 — Per-command --yes only + Pinned dependencies**\n- **Removed session-wide `NEXLINK_AUTO_APPROVE`** — `--yes` / `-y` is now strictly **per-command**\n  - `utils.confirm_or_die()` no longer checks env var; uses `auto_approved` kwarg only\n  - `--yes` must be appended to each individual command; there is no env bypass\n  - Nextcloud `run_cli()` uses module-level `_AUTO_APPROVED` instead of env\n  - Exit code changed from 1 → 2 on non-confirmation\n  - Tests updated for new behavior\n- **Pinned all pip dependencies** to exact versions in `SKILL.md` + `requirements.txt`\n  - `exchangelib==5.6.0`, `requests-ntlm==1.3.0`, `defusedxml==0.7.1`, `requests==2.31.0`, `lxml==6.0.2`\n\n**Phase 2 — Branding opt-out simplification**\n- Removed `--no-branding` global flag and `NEXLINK_NO_BRANDING` env var references from CLI\n- Branding is controlled by skill modules at output generation level (not CLI)\n- Usage text updated; references to `NEXLINK_NO_BRANDING` removed from security docs\n\n**Phase 3 — Data handling: permissions + disclosure**\n- **Config file permissions**: `config.save()` now sets `chmod 0o600` on saved config files\n- **Log file permissions**: `logger.py` now creates log directory `0o700` and log files `0o600`\n- **Sync state permissions**: `save_sync_state()` sets `0o600` on state file and `0o700` on parent dir\n- Added comment in `config.template.yaml` about permission expectations for state file directory\n- **Password handling**: config.save() already strips password from written file; added audit comment\n- **Logging credentials**: NexLink does NOT log credentials or raw email content to log files\n\n**Phase 4 — Documentation & disclosure**\n- `SECURITY.md`: Updated security model, removed `NEXLINK_AUTO_APPROVE` references\n- `references/security-best-practices.md`: Removed `NEXLINK_AUTO_APPROVE` docs, kept per-command `--yes`\n- `CHANGELOG.md`: This comprehensive entry for audit trail\n\n**Phase 5 — Branding opt-in + env metadata (Privacy-first)**\n- `BRAND.md`: Branding is now **OFF by default** (privacy-first). Enable with `NEXLINK_BRANDING=1` (opt-in)\n  - `NEXLINK_NO_BRANDING` removed; old opt-out mechanism deprecated\n- `SKILL.md`: Added `NEXLINK_BRANDING` to env vars list\n- `clawhub.json`: Added `env` field documenting all required variables\n  - Full transparency: lists all 9 required/optional env vars for ClawHub security scan\n- Closes ClawScan findings #2 (Human-Agent Trust) and #3 (Supply Chain)\n\n## [Unreleased]\n\n## [0.15.0] - 2026-04-30\n\n### Security (ClawScan Audit Remediation)\n\n- **Prompt Approval System** — all destructive operations now require explicit confirmation\n  - 29 operations guarded: send, reply, forward, create/delete event, respond meeting, create/complete/trash task, create/update/delete contact, sync, link-calendar, delete/move/copy file, share-revoke, create-tasks-from-file --execute\n  - Global `--yes` / `-y` flag for non-interactive bypass\n  - `NEXLINK_AUTO_APPROVE=1` environment variable for session-wide bypass\n  - Non-TTY fallback: JSON error with clear instructions to use `--yes`\n  - 8 new unit tests covering TTY, non-TTY, env var, abort scenarios (all passing)\n- **SECURITY.md** — GitHub-standard vulnerability disclosure policy with coordinated disclosure timeline (2 days acknowledgment, 5 days assessment, 30 days fix, 90 days disclosure)\n- **references/security-best-practices.md** — comprehensive least-privilege deployment guide (dedicated accounts, credential rotation, network isolation, logging, monitoring)\n- **Opt-out controls**:\n  - `--no-branding` / `NEXLINK_NO_BRANDING=1` — suppress branding in outputs\n  - `--no-memory` / `NEXLINK_NO_MEMORY=1` — opt-out of LCM persistent memory\n- **requirements.lock** — fully pinned dependencies for reproducible builds\n\n### Added\n\n- GitHub repository link in SKILL.md description for official branding\n- Professional header in README.md with official links table\n- `clawhub.json` enhanced with badges, keywords, and full link portfolio\n- `BRAND.md` updated with opt-out instructions\n\n### Changed\n\n- **Version**: 0.14.1 → **0.15.0** (minor bump — new security features, backward compatible)\n- **Name**: \"NexLink — Nextcloud, Exchange & YouTube Connector\" → \"NexLink — Enterprise Connector for Nextcloud, Exchange & YouTube\"\n\n### Verification\n\n- ✅ 48/48 unit tests passing\n- ✅ 9 real-world scenarios validated\n- ✅ Zero breaking changes\n- ✅ ClawScan security audit: 7/7 findings remediated\n\n---\n\n## [0.14.1] - 2026-04-29\n\n### Changed\n\n- Version bump to v0.14.1 for release\n\n## [0.13.0] - 2026-04-29\n\n### Added\n\n- **YouTube Transcript Extraction** — full module with `nexlink youtube transcript` and `nexlink youtube languages` commands\n- Supports all URL formats (watch, youtu.be, shorts, embed) and raw video IDs\n- Automatic language fallback (e.g. `--lang ro,en`)\n- Output formats: text (plain) and JSON (timestamped snippets)\n- Save to Nextcloud with `--save` flag (saves to `/Alex's Assistant/YouTube/`)\n- Comprehensive test suite: 23 tests covering ID extraction, error handling, formatting, live API, and CLI integration\n\n## [0.12.0] - 2026-04-28\n\n### Added\n\n- **Exchange contacts module** — full CRUD + search via EWS\n  - `nexlink contacts list|get|create|update|delete|search`\n  - Server-side search with Q() filter (display_name, given_name, surname, company_name, email)\n  - Safe delete via `move_to_trash()`\n- **Nextcloud contacts module** — CardDAV contacts with auto-discovered principal\n  - `nexlink contacts addressbooks|list|get|create|update|delete|search --source nextcloud`\n  - vCard ↔ dict conversion\n  - Automatic DAV principal discovery (handles GUID-based principals)\n  - Cached principal resolution (avoids PROPFIND per call)\n- **Integration tests** — 11 Exchange live + 12 Nextcloud live tests\n\n### Fixed\n\n- **`_get_contacts_folder`** was returning `account.contacts.root` (MailFolder) instead of `account.contacts`\n- **`ContactPhoneNumbers` removed in exchangelib 5.x** — use `List[PhoneNumber]` with `label` + `phone_number`\n- **`EmailAddress` import path** — `email_addresses` accepts `List[EmailAddress]` objects, not dicts\n- **`PhysicalAddress` moved to `exchangelib.indexed_properties`** — import from `exchangelib.properties` raised `ImportError`\n- **Nextcloud DAV principal mismatch** — `_dav_base_path()` used login username but Nextcloud may use a GUID; now auto-discovers via PROPFIND\n\n## [0.11.0] - 2026-04-25\n\n### Added\n\n- **OWNER_EMAIL config variable** — optional env var for notification recipient\n  - Priority chain: `--to` flag > `OWNER_EMAIL` > `account.primary_smtp_address`\n  - Defaults to `EXCHANGE_EMAIL` when not set (backward compatible)\n  - Documented in SKILL.md env vars list\n- **Integration tests for OWNER_EMAIL fallback** — 3 new tests in `TestOwnerEmailFallback`\n  - `test_reminder_uses_owner_email` — verifies OWNER_EMAIL is used as recipient\n  - `test_reminder_falls_back_to_account_email` — verifies fallback to Exchange account\n  - `test_reminder_explicit_to_overrides_owner_email` — verifies `--to` flag priority\n- **Integration tests for Exchange sync operations** — 15 new tests covering sync, error handling, and reminder flows\n\n### Changed\n\n- `cmd_reminders` now resolves recipient via `get_connection_config()` instead of `account.primary_smtp_address` directly\n\n## [0.9.0] - 2026-04-22\n\n### Changed\n\n- **Complete rebrand: imm-romania → NexLink**\n  - Skill name, CLI command, folder, script, all references updated\n  - GitHub repo renamed to `openclaw-nexlink`\n  - ClawHub slug: `nexlink`\n  - Public name: **NexLink — Exchange & Nextcloud Connector**\n  - Built by Firma de AI, supported by Firma de IT\n\n## [0.5.1] - 2026-04-11\n\n### Added\n\n- **Nextcloud document understanding**\n  - `extract-text` for supported text, DOCX, and PDF files\n  - `summarize` for grounded one-file summaries\n  - `ask-file` for extractive Q&A over a single file\n- **Nextcloud workflow intelligence**\n  - `extract-actions` for grounded action extraction with due-date and owner hints\n  - `create-tasks-from-file` to create Exchange tasks from extracted file actions\n\n### Changed\n\n- **Product boundary cleanup**\n  - NexLink now focuses on Exchange + Nextcloud only\n  - MSP runtime, scripts, tests, and examples were removed from this repo\n  - MSP logic now lives in a separate dedicated skill\n- **Documentation refresh**\n  - README, SKILL, setup guide, and verification docs now describe the current CLI accurately\n- **Packaging metadata**\n  - version metadata aligned to `0.4.0`\n  - setup metadata updated for the current CLI script and recommended PDF dependency\n\n### Fixed\n\n- Unified CLI help now reflects the final Nextcloud command surface after cleanup and integration\n- Release metadata inconsistencies across `SKILL.md`, `README.md`, `VERIFICATION.md`, and `setup.py`\n\n## [0.2.0] - 2026-03-30\n\n### Added\n\n- **Task Sync Module**: Bidirectional sync with Exchange server\n  - `sync sync` - Synchronize tasks with server\n  - `sync status` - Show sync statistics\n  - `sync reminders` - Email reminders for overdue/upcoming tasks\n  - `sync link-calendar` - Create calendar event from task\n- **Hardshell Coding Standards**: Applied to all Exchange modules\n  - Black formatting (PEP 8)\n  - Ruff linting (fixed unused imports)\n  - Comprehensive test suite (24 tests passing)\n- **Module Organization**: Clean separation of concerns\n  - `modules/exchange/` - Email, Calendar, Tasks, Sync\n  - `modules/nextcloud/` - File management\n  - `scripts/nexlink.py` - Unified CLI entry point\n- **Documentation**: Setup guide, skill docs, coding standards\n\n### Fixed\n\n- Test imports for module paths\n- CLI execution path in tests\n- Duplicate function definitions removed\n\n## [0.1.0] - 2026-03-30\n\n### Added - Initial Release\n\n- Email operations: connect, read, get, send, draft, reply, forward, mark, attachments\n- Calendar operations: connect, list, today, week, get, create, update, delete, respond, availability\n- Tasks operations: connect, list, get, create, update, complete, delete\n- Unified CLI with `nexlink mail|calendar|tasks` commands\n- Configuration via environment variables or config file\n- Self-signed certificate support via `verify_ssl: false`\n- MIT License\n- GitHub issue templates and PR template\n\n## [2.0.0-alpha] - 2026-03-30\n\n### Added - Meta-Skill Architecture\n\n**Breaking Change**: Restructured as meta-skill with modular architecture.\n\n- **Modules**: Separated Exchange and Nextcloud into independent modules\n- **Exchange Module**: Email, Calendar, Tasks operations (moved from root)\n- **Nextcloud Module**: File management via WebDAV (new)\n- **Memory Integration**: Documentation for LCM plugin integration\n- **Unified CLI**: New orchestrator `nexlink.py` for all modules\n\n### Added - Exchange Module\n\n- All previous email, calendar, and tasks functionality\n- Task sync with Exchange server\n- Email reminders for overdue/upcoming tasks\n- Calendar event creation from tasks\n- Logging system with JSON and colored output\n- Complete test suite (9 tests passing)\n\n### Added - Nextcloud Module\n\n- File operations: upload, download, list, delete, move, copy\n- Directory creation and management\n- Automatic user ID resolution for WebDAV paths\n- Error handling with specific exit codes\n\n### Added - Memory (LCM Plugin)\n\n- Documentation for Lossless Context Management plugin\n- Instructions for persistent conversation history\n- Tool descriptions: `lcm_grep`, `lcm_describe`, `lcm_expand_query`\n\n### Added - Workflow Integrations\n\n- Email + Files: Send attachments from Nextcloud\n- Email + Files: Save attachments to Nextcloud\n- Calendar + Tasks: Create calendar events from tasks\n- Memory + All: Context-aware operations\n\n### Changed - Architecture\n\n- **Before**: Single skill with Exchange only\n- **After**: Meta-skill orchestrating multiple modules\n  - `modules/exchange/` - Email, Calendar, Tasks\n  - `modules/nextcloud/` - File management\n  - `references/setup.md` - Complete setup guide\n  - `assets/config.template.yaml` - Configuration template\n\n### Changed - Documentation\n\n- New SKILL.md as meta-skill documentation\n- Per-module SKILL.md files\n- Comprehensive setup guide in `references/setup.md`\n- Updated README with module structure\n\n### Migration Guide (1.x to 2.0)\n\nIf upgrading from 1.x:\n\n1. Update imports:\n   ```python\n   # Before\n   from scripts.mail import MailClient\n   \n   # After\n   from modules.exchange.mail import MailClient\n   ```\n\n2. Update CLI commands:\n   ```bash\n   # Before\n   python3 scripts/mail.py connect\n   \n   # After\n   python3 scripts/nexlink.py mail connect\n   # Or simply\n   nexlink mail connect\n   ```\n\n3. New environment variables for Nextcloud:\n   ```bash\n   export NEXTCLOUD_URL=\"https://cloud.example.com\"\n   export NEXTCLOUD_USERNAME=\"your-username\"\n   export NEXTCLOUD_APP_PASSWORD=\"your-app-password\"\n   ```\n\n---\n\n## [1.0.0] - 2026-03-30\n\n### Added\n\n- Email operations: connect, read, get, send, draft, reply, forward, mark, attachments\n- Calendar operations: connect, list, today, week, get, create, update, delete, respond, availability\n- Tasks operations: connect, list, get, create, update, complete, delete\n- Unified CLI with `nexlink mail|calendar|tasks` commands\n- Configuration via environment variables or config file\n- Self-signed certificate support via `verify_ssl: false`\n- MIT License\n- GitHub issue templates and PR template\n\n### Security\n\n- Credentials only from environment variables (never hardcoded)\n- SSL verification configurable for self-signed certificates\n\n---\n\n## [Unreleased]\n\n### Planned\n\n- Distribution lists management\n- Room booking\n- Delegate access support (full)\n- Docker deployment\n\nFile v0.15.9:CONTRIBUTING.md\n\n# Contributing to OpenClaw NexLink\n\nThank you for your interest in contributing!\n\n## Development Standards\n\nThis project follows the [Hardshell Coding Standards](https://github.com/asistent-alex/openclaw-hardshell).\n\n### Quick Reference\n\n- **Security**: Validate all input, no secrets in code, HTTPS everywhere\n- **Architecture**: SOLID principles, separation of concerns\n- **Testing**: TDD with 70% minimum coverage\n- **Git**: Conventional commits, feature branches\n\n## Running Checks\n\n```bash\n# Format code\nblack modules/ tests/\n\n# Lint\nruff check modules/ tests/\n\n# Type check (optional)\nmypy modules/\n\n# Run tests\nPYTHONPATH=modules/exchange pytest tests/ -v\n\n# Run tests with coverage\nPYTHONPATH=modules/exchange pytest tests/ --cov=modules --cov-report=html\n```\n\n## Branch Strategy\n\n- `main` - always deployable, protected\n- `feature/<slug>` - short-lived feature branches\n- `fix/<slug>` - bug fix branches\n- `alpha-testing` - integration testing\n\n## Commit Format\n\nUse [Conventional Commits](https://www.conventionalcommits.org/):\n\n```\n<type>(<scope>): <short description>\n\nTypes: feat, fix, docs, style, refactor, test, chore\n```\n\nExamples:\n- `feat(mail): add attachment support`\n- `fix(calendar): handle timezone correctly`\n- `docs(readme): update installation instructions`\n\n## Pull Request Process\n\n1. Fork the repository\n2. Create a feature branch: `git checkout -b feature/my-feature`\n3. Make changes following Hardshell standards\n4. Run tests: `PYTHONPATH=modules/exchange pytest tests/ -v`\n5. Run linting: `ruff check modules/ tests/`\n6. Submit a pull request\n\n### PR Checklist\n\n- [ ] Code follows Hardshell standards\n- [ ] All tests pass\n- [ ] New code has tests\n- [ ] Documentation updated (if needed)\n- [ ] No secrets in code\n- [ ] Conventional commit format used\n\n## Code of Conduct\n\nBe respectful, constructive, and inclusive.\n\n## Getting Help\n\n- Open an issue for bugs or feature requests\n- Check existing issues before creating new ones\n- Provide clear reproduction steps for bugs\n\n## License\n\nBy contributing, you agree that your contributions will be licensed under the MIT License.\n\nFile v0.15.9:SECURITY.md\n\n# Security Policy\n\n## Supported Versions\n\n| Version | Supported          |\n| ------- | ------------------ |\n| 0.14.x  | :white_check_mark: |\n| < 0.14  | :x:                |\n\n## Reporting a Vulnerability\n\n**Do not open a public issue.** Instead, email:\n\n📧 **security@firmade.ai**\n\nPGP key available at: https://firmade.ai/security/pgp-key.asc\n\n### What to expect\n\n| Step | Timeline |\n|------|----------|\n| Acknowledgment | Within 2 business days |\n| Initial assessment | Within 5 business days |\n| Fix preparation | Within 30 days |\n| Coordinated disclosure | Mutually agreed date (max 90 days) |\n\n### Scope\n\nNexLink is an OpenClaw skill that integrates Exchange, Nextcloud, and YouTube transcript extraction.\n\nIssues in scope include:\n- Missing or broken confirmation prompts on destructive operations\n- Credential leaks or unsafe handling of env vars / tokens\n- Path traversal in Nextcloud WebDAV operations\n- HTML injection in generated email digests\n- Unauthorized data access through Exchange EWS delegate escalation\n- LCM memory poisoning or cross-user context leakage\n\nOut of scope:\n- Issues in third-party services (Exchange server, Nextcloud instance, YouTube API)\n- Social engineering that requires physical access\n- Denial of service without data exposure\n\n## Security Design\n\nNexLink's security model, described in [references/security-best-practices.md](references/security-best-practices.md):\n- All destructive commands require explicit confirmation (interactive or per-command `--yes` flag)\n- `move_to_trash()` is used for task deletion instead of permanent `delete()`\n- Branding can be suppressed via `--no-branding` / `NEXLINK_NO_BRANDING=1`\n- Dedicated least-privilege service accounts strongly recommended\n\n## Acknowledgments\n\nWe appreciate responsible disclosure and will publicly thank researchers who follow this policy (unless they prefer anonymity).\n\nArchive v0.15.8: 49 files, 125400 bytes\n\nFiles: ABOUT.md (1963b), assets/config.template.yaml (1872b), BRAND.md (4565b), CHANGELOG.md (13388b), clawhub.json (1914b), config.template.yaml (521b), CONTRIBUTING.md (2106b), modules/exchange/__init__.py (94b), modules/exchange/__main__.py (267b), modules/exchange/analytics.py (17410b), modules/exchange/cal.py (21370b), modules/exchange/cli.py (4523b), modules/exchange/config.py (10217b), modules/exchange/connection.py (7414b), modules/exchange/contacts.py (12105b), modules/exchange/logger.py (9231b), modules/exchange/mail.py (22337b), modules/exchange/SKILL.md (6067b), modules/exchange/sync.py (15477b), modules/exchange/tasks.py (21629b), modules/exchange/utils.py (5582b), modules/nextcloud/contacts.py (23849b), modules/nextcloud/nextcloud.py (67102b), modules/nextcloud/SKILL.md (5301b), modules/youtube/__init__.py (57b), modules/youtube/__main__.py (99b), modules/youtube/youtube.py (10947b), push-commands.sh (824b), README.md (11599b), references/security-best-practices.md (3569b), references/setup.md (4206b), requirements.txt (180b), scripts/nexlink.py (11719b), scripts/validate.sh (2290b), SECURITY.md (1877b), setup.py (1297b), SKILL.md (10469b), tasks/state.json (965b), tasks/todo.md (962b), tests/integration/__init__.py (54b), tests/integration/test_sync.py (21491b), tests/test_all.py (11809b), tests/test_contacts.py (17445b), tests/test_exchange_contacts_live.py (13579b), tests/test_nextcloud_contacts_live.py (16744b), tests/test_nextcloud.py (21225b), tests/test_youtube.py (6106b), VERIFICATION.md (4896b), _meta.json (127b)\n\nFile v0.15.8:modules/exchange/SKILL.md\n\n---\nname: exchange\ndescription: Email, Calendar, and Tasks for Exchange on-premises (2016/2019). Use for reading/sending emails, managing calendar events, creating tasks, and syncing with Exchange server. Triggers on phrases like \"send email\", \"check calendar\", \"create task\", \"exchange mail\", \"outlook calendar\".\n---\n\n# Exchange Module\n\nEmail, Calendar, and Tasks operations for Microsoft Exchange Server on-premises (2016/2019) via EWS.\n\n## Requirements\n\n- Exchange Server 2016 or 2019 (on-premises)\n- EWS enabled on server\n- Account with mailbox permissions\n\n## Configuration\n\nSet environment variables:\n\n```bash\nexport EXCHANGE_SERVER=\"https://mail.example.com/EWS/Exchange.asmx\"\nexport EXCHANGE_USERNAME=\"your-username\"\nexport EXCHANGE_PASSWORD=\"your-password\"\nexport EXCHANGE_EMAIL=\"your-email@example.com\"\n```\n\nOr use a config file `config.yaml`:\n\n```yaml\nexchange:\n  server: https://mail.example.com/EWS/Exchange.asmx\n  username: ${EXCHANGE_USERNAME}\n  password: ${EXCHANGE_PASSWORD}\n  email: your-email@example.com\n  verify_ssl: false  # for self-signed certs\n```\n\n## Commands\n\n### Email (mail)\n\n```bash\n# Test connection\npython3 -m modules.exchange mail connect\n\n# List emails\npython3 -m modules.exchange mail read --limit 10\npython3 -m modules.exchange mail read --folder Inbox --unread\npython3 -m modules.exchange mail read --from \"boss@company.com\"\n\n# Send email\npython3 -m modules.exchange mail send --to \"user@example.com\" --subject \"Hello\" --body \"Message\"\n\n# Reply/Forward\npython3 -m modules.exchange mail reply --id EMAIL_ID --body \"Reply text\"\npython3 -m modules.exchange mail forward --id EMAIL_ID --to \"other@example.com\"\n\n# Attachments\npython3 -m modules.exchange mail list-attachments --id EMAIL_ID\npython3 -m modules.exchange mail download-attachment --id EMAIL_ID --name \"file.pdf\"\n```\n\n### Calendar (cal)\n\n```bash\n# List events\npython3 -m modules.exchange cal list --days 7\npython3 -m modules.exchange cal today\npython3 -m modules.exchange cal week\n\n# Create event\npython3 -m modules.exchange cal create --subject \"Meeting\" --start \"2024-01-15 14:00\" --duration 60\n\n# With attendees\npython3 -m modules.exchange cal create --subject \"Team Meeting\" --start \"2024-01-15 14:00\" --to \"user1@example.com,user2@example.com\"\n\n# Update/Delete\npython3 -m modules.exchange cal update --id EVENT_ID --location \"Room 101\"\npython3 -m modules.exchange cal delete --id EVENT_ID\n\n# Respond to meeting\npython3 -m modules.exchange cal respond --id EVENT_ID --response accept\n```\n\n### Tasks (tasks)\n\n```bash\n# List tasks (own mailbox)\npython3 -m modules.exchange tasks list\npython3 -m modules.exchange tasks list --overdue\npython3 -m modules.exchange tasks list --status in_progress\n\n# List tasks from another mailbox (delegate access)\npython3 -m modules.exchange tasks list --mailbox user@example.com\n\n# Create task (in your own mailbox)\npython3 -m modules.exchange tasks create --subject \"Review proposal\" --due \"+7d\" --priority high\n\n# Create task in another user's mailbox (requires delegate permissions)\npython3 -m modules.exchange tasks create --assign-to user@example.com --subject \"Review report\" --due \"2024-01-20\"\n\n# Get task details\npython3 -m modules.exchange tasks get --id TASK_ID\npython3 -m modules.exchange tasks get --id TASK_ID --mailbox user@example.com\n\n# Update task\npython3 -m modules.exchange tasks update --id TASK_ID --subject \"Updated subject\"\npython3 -m modules.exchange tasks update --id TASK_ID --status in_progress\n\n# Complete task\npython3 -m modules.exchange tasks complete --id TASK_ID\n\n# Move task to Deleted Items (trash)\npython3 -m modules.exchange tasks trash --id TASK_ID\npython3 -m modules.exchange tasks trash --mailbox user@example.com --id TASK_ID  # Requires delete permission\n```\n\n**Note on trash:** The `trash` command moves tasks to the Deleted Items folder. For delegate mailboxes, the service account has Editor permissions (can create/edit/complete tasks) but **cannot delete tasks**. This is intentional - tasks are preserved until you manually delete them from Outlook. When trash fails, the error message suggests completing the task or deleting manually from Outlook.\n\n### Error Handling\n\nAll task commands return informative error messages in Romanian with:\n\n- `error`: Clear error message\n- `cause`: Why it happened\n- `alternatives`: Available options\n\n**Example - Permission denied:**\n```json\n{\n  \"ok\": false,\n  \"error\": \"Task-urile pot fi șterse doar manual din Outlook.\",\n  \"cause\": \"Asistentul are permisiuni de Editor (poate crea/edita/completa), dar nu poate șterge task-urile. Aceasta e o limitare intenționată - task-urile se păstrează până le ștergi tu.\",\n  \"alternatives\": [\n    {\"action\": \"complete\", \"description\": \"Marchează task-ul ca finalizat (recomandat)\"},\n    {\"action\": \"manual_delete\", \"description\": \"Șterge manual din Outlook sau OWA\"}\n  ]\n}\n```\n\n**Example - Task not found:**\n```json\n{\n  \"ok\": false,\n  \"error\": \"Task-ul nu a fost găsit.\",\n  \"cause\": \"Task ID xxx nu există sau este invalid.\",\n  \"alternatives\": [\n    {\"action\": \"list\", \"description\": \"Listează task-urile disponibile\"}\n  ]\n}\n```\n\n### Sync (sync)\n\n```bash\n# Bidirectional sync with Exchange\npython3 -m modules.exchange sync sync\n\n# Show sync status\npython3 -m modules.exchange sync status\n\n# Send reminders for overdue/upcoming tasks\npython3 -m modules.exchange sync reminders --hours 24\n\n# Dry-run (show what would be sent)\npython3 -m modules.exchange sync reminders --hours 24 --dry-run\n\n# Create calendar event from task\npython3 -m modules.exchange sync link-calendar --id TASK_ID --time \"14:00\" --duration 60\n```\n\n## Notes\n\n- Tasks are created in your own Tasks folder by default\n- **Task Assignment**: Use `--assign-to user@example.com` to create tasks directly in another user's Exchange mailbox. This requires the service account to have delegate permissions on the target mailbox (configured on the Exchange server).\n- For collaborative tasks, use calendar events with attendees\n- For Exchange Online (Office 365), configuration may differ\n- Self-signed certificates require `verify_ssl: false`\n\nFile v0.15.8:modules/nextcloud/SKILL.md\n\n---\nname: nextcloud\ndescription: File management, document understanding, and workflow intelligence for Nextcloud via WebDAV and OCS APIs. Use for uploading, downloading, listing, searching, extracting text, summarizing files, Q&A over files, extracting workflow actions, creating Exchange tasks from files, sharing, moving, and copying files and folders on Nextcloud. Triggers on phrases like \"upload to nextcloud\", \"download from nextcloud\", \"list files on nextcloud\", \"search nextcloud\", \"summarize nextcloud file\", \"ask nextcloud file\", \"extract actions from file\", \"create tasks from file\", \"create nextcloud share link\", \"nextcloud file operations\".\n---\n\n# Nextcloud Module\n\nFile management on Nextcloud server using WebDAV protocol and OCS sharing APIs.\n\n## Requirements\n\n- Nextcloud instance with WebDAV enabled\n- App password (generate from Nextcloud security settings)\n\n## Configuration\n\nSet environment variables:\n\n```bash\nexport NEXTCLOUD_URL=\"https://cloud.example.com\"\nexport NEXTCLOUD_USERNAME=\"your-username\"\nexport NEXTCLOUD_APP_PASSWORD=\"your-app-password\"\n```\n\n## Commands\n\n### shared\nList folders shared with the current user.\n\n```bash\npython3 -m modules.nextcloud shared\n```\n\nReturns: Name, owner, permissions, and path for each shared folder.\n\n### list\nList files and folders in a directory.\n\n```bash\npython3 -m modules.nextcloud list /path/to/directory/\npython3 -m modules.nextcloud list /path/to/directory/ --recursive\n```\n\nReturns: File name, type (file/folder), size, and last modified date.\n\n### search\nSearch files and folders by name, recursively.\n\n```bash\npython3 -m modules.nextcloud search contract /Clients/\n```\n\nReturns: Matching files/folders with path, type, size, and last modified date.\n\n### extract-text\nExtract readable text from one supported file.\n\n```bash\npython3 -m modules.nextcloud extract-text /Clients/contract.docx\n```\n\n### summarize\nCreate a grounded summary for one file.\n\n```bash\npython3 -m modules.nextcloud summarize /Clients/contract.docx\n```\n\n### ask-file\nAnswer a question using one file as the source.\n\n```bash\npython3 -m modules.nextcloud ask-file /Clients/contract.docx \"When is the renewal due?\"\n```\n\n### extract-actions\nExtract grounded workflow actions from one file.\n\n```bash\npython3 -m modules.nextcloud extract-actions /Clients/contract.txt\n```\n\nReturns: action items, due-date hints, owner hints, and source excerpts.\n\n### create-tasks-from-file\nPreview or create Exchange tasks from extracted file actions.\n\n```bash\npython3 -m modules.nextcloud create-tasks-from-file /Clients/contract.txt\npython3 -m modules.nextcloud create-tasks-from-file /Clients/contract.txt --select 1,2 --execute\npython3 -m modules.nextcloud create-tasks-from-file /Clients/contract.txt --mailbox user@example.com --execute\n```\n\n### upload\nUpload a local file to Nextcloud.\n\n```bash\npython3 -m modules.nextcloud upload /local/file.txt /remote/directory/\n```\n\n### download\nDownload a file from Nextcloud to local filesystem.\n\n```bash\npython3 -m modules.nextcloud download /remote/file.txt /local/directory/\n```\n\n### mkdir\nCreate a new directory on Nextcloud.\n\n```bash\npython3 -m modules.nextcloud mkdir /new/folder/path/\n```\n\n### delete\nDelete a file or directory on Nextcloud.\n\n```bash\npython3 -m modules.nextcloud delete /path/to/delete\n```\n\n### move\nMove or rename a file or directory.\n\n```bash\npython3 -m modules.nextcloud move /old/path /new/path\n```\n\n### copy\nCopy a file or directory.\n\n```bash\npython3 -m modules.nextcloud copy /source/path /destination/path\n```\n\n### info\nGet detailed information about a file or directory.\n\n```bash\npython3 -m modules.nextcloud info /path/to/item\n```\n\n### share-create\nCreate a public share link for a file or folder.\n\n```bash\npython3 -m modules.nextcloud share-create /Contracts/offer.pdf\npython3 -m modules.nextcloud share-create /Dropzones/Inbox --public-upload --expire-date 2026-04-30\n```\n\n### share-list\nList public share links, optionally filtered by path.\n\n```bash\npython3 -m modules.nextcloud share-list\npython3 -m modules.nextcloud share-list /Contracts/offer.pdf\n```\n\n### share-revoke\nRevoke a public share link by share ID.\n\n```bash\npython3 -m modules.nextcloud share-revoke 42\n```\n\n## Error Handling\n\n- Exit code 0: Success\n- Exit code 1: Missing configuration or invalid command usage\n- Exit code 3: Connection/authentication/operation error\n- Exit code 4: File or directory not found (for info-like lookups)\n\n## Notes\n\n- Nextcloud WebDAV uses user ID (not username) in paths - the script resolves this automatically\n- Search currently matches file/folder names and paths, not document content\n- `extract-text`, `summarize`, `ask-file`, `extract-actions`, and `create-tasks-from-file` operate on one file at a time\n- `create-tasks-from-file` is preview-first by default; use `--execute` to actually create Exchange tasks\n- `--select 1,2,...` lets you approve only a subset of extracted task proposals\n- PDF extraction uses `pdfplumber` (recommended, MIT license, best table/layout handling) with `pypdf` as fallback; install `pdfplumber` for best results\n- Task creation uses Exchange delegate access when `--mailbox` is supplied\n- Share-link commands use the Nextcloud OCS sharing API\n- For large files, ensure sufficient timeout settings\n- Self-signed certificates may require additional configuration\n\nFile v0.15.8:SKILL.md\n\n---\nname: nexlink\nversion: 0.15.3\ndescription: \"🔗 NexLink — Enterprise Connector for Nextcloud, Exchange & YouTube. Built by Firma de AI. Email, calendar, tasks, file management, document understanding, transcript extraction, contacts, analytics — with built-in security confirmations and least-privilege defaults.\"\nmetadata:\n  openclaw:\n    requires:\n      bins:\n        - python3\n        - pip3\n      env:\n        - EXCHANGE_SERVER\n        - EXCHANGE_USERNAME\n        - EXCHANGE_PASSWORD\n        - EXCHANGE_EMAIL\n        - OWNER_EMAIL  # Optional: recipient for notifications (defaults to EXCHANGE_EMAIL)\n        - NEXTCLOUD_URL\n        - NEXTCLOUD_USERNAME\n        - NEXTCLOUD_APP_PASSWORD\n    dependencies:\n      - name: exchangelib\n        type: pip\n        version: \"==5.6.0\"\n      - name: requests-ntlm\n        type: pip\n        version: \"==1.3.0\"\n      - name: defusedxml\n        type: pip\n        version: \"==0.7.1\"\n        description: \"Secure XML parsing — fixes XXE vulnerability\"\n      - name: requests\n        type: pip\n        version: \"==2.31.0\"\n      - name: lxml\n        type: pip\n        version: \"==6.0.2\"\n      - name: pdfplumber\n        type: pip\n        version: \">=0.10.0\"\n        optional: true\n      - name: youtube-transcript-api\n        type: pip\n        version: \">=1.0.0\"\n        description: \"Document understanding features\"\n      - name: pytest\n        type: pip\n        version: \">=7.0.0\"\n        optional: true\n        description: \"Testing framework\"\n    primaryEnv: EXCHANGE_SERVER\n    skillKey: \"nextlink\"\n    emoji: \"🔗\"\n    homepage: https://github.com/asistent-alex/openclaw-nexlink\n    always: false\n    author: Firma de AI\n    links:\n      homepage: https://firmade.ai\n      repository: https://github.com/asistent-alex/openclaw-nexlink\n---\n\n# NexLink — Nextcloud, Exchange & YouTube Connector\n\n**Built by [Firma de AI](https://firmade.ai), supported by [Firma de IT](https://firmade.it).**\n\nThis skill connects Nextcloud, Exchange, and YouTube into one practical workflow layer for:\n\n- **Nextcloud**: file operations, sharing, document understanding, workflow extraction\n- **Exchange**: email, calendar, tasks, analytics\n- **YouTube**: transcript extraction with language fallback\n\n## Available Modules\n\n| Module | Description | Command |\n|--------|-------------|---------|\n| **Nextcloud** | Files, sharing, summarization, Q&A, action extraction, Contacts (CardDAV) | `nexlink files <...> \\| nexlink contacts --source nextcloud <...>` |\n| **Exchange** | Email, Calendar, Tasks, Analytics, Contacts | `nexlink <mail\\|cal\\|tasks\\|analytics\\|sync\\|contacts>` |\n| **YouTube** | Transcript extraction with language fallback | `nexlink youtube transcript\\|languages <url>` |\n\n## What it solves\n\nUse this skill when you want to work with:\n\n- Nextcloud files: listing, search, upload, download, move, sharing\n- document understanding: extract-text, summarize, ask-file\n- workflow extraction: extract actions from files and create Exchange tasks\n- YouTube transcripts: `nexlink youtube transcript <url>` (text/JSON, language fallback, save to Nextcloud)\n- emails, replies, drafts and attachments in Exchange\n- calendar, meetings and follow-up tasks\n- Exchange tasks, including delegate access\n- Contacts: Exchange contacts (EWS) and Nextcloud contacts (CardDAV)\n\n## Quick Start\n\n### Email\n\n```bash\n# Connection\nnexlink mail connect\n\n# List emails\nnexlink mail read --limit 10\nnexlink mail read --unread\n\n# Send email\nnexlink mail send --to \"client@example.com\" --subject \"Offer\" --body \"...\"\n\n# Reply\nnexlink mail reply --id EMAIL_ID --body \"Reply\"\n```\n\n### Calendar\n\n```bash\n# Events\nnexlink cal today\nnexlink cal week\nnexlink cal list --days 7\n\n# Create event\nnexlink cal create --subject \"Meeting\" --start \"2024-01-15 14:00\" --duration 60\n\n# With attendees\nnexlink cal create --subject \"Team Meeting\" --start \"2024-01-15 14:00\" --to \"user1@example.com,user2@example.com\"\n```\n\n### Tasks\n\n```bash\n# List\nnexlink tasks list\nnexlink tasks list --overdue\n\n# Create\nnexlink tasks create --subject \"Review proposal\" --due \"+7d\" --priority high\n\n# Complete\nnexlink tasks complete --id TASK_ID\n```\n\n### Analytics (Email Statistics)\n\n```bash\n# General statistics\nnexlink analytics stats --days 30\n\n# Average response time\nnexlink analytics response-time --days 7\n\n# Top senders\nnexlink analytics top-senders --limit 20\n\n# Activity heatmap\nnexlink analytics heatmap --days 30\n\n# Statistics per folder\nnexlink analytics folders\n\n# Full report\nnexlink analytics report --days 30\n```\n\n### Contacts\n\n```bash\n# Exchange contacts (default source)\nnexlink contacts list\nnexlink contacts list --limit 10\n\n# Get Exchange contact by ID\nnexlink contacts get --id CONTACT_ID\n\n# Create Exchange contact\nnexlink contacts create --name \"John Doe\" --email \"john@example.com\" --phone \"+40-700-000-000\"\nnexlink contacts create --name \"Acme Corp\" --phone \"+40-711-111-111\" --org \"Acme\" --title \"CEO\"\n\n# Update Exchange contact\nnexlink contacts update --id CONTACT_ID --phone \"+40-722-222-222\"\n\n# Delete Exchange contact (moves to trash)\nnexlink contacts delete --id CONTACT_ID\n\n# Search contacts\nnexlink contacts search --query \"Acme\"\n\n# Nextcloud contacts (CardDAV — use --source nextcloud)\nnexlink contacts addressbooks --source nextcloud\nnexlink contacts list --source nextcloud\nnexlink contacts list --source nextcloud --addressbook \"/remote.php/dav/addressbooks/users/alex/contacts/\"\n\n# Get Nextcloud contact by UID\nnexlink contacts get --uid CONTACT_UID --source nextcloud\n\n# Create Nextcloud contact\nnexlink contacts create --source nextcloud --name \"Jane Doe\" --email \"jane@example.com\" --phone \"+40-733-333-333\"\n\n# Update Nextcloud contact\nnexlink contacts update --uid CONTACT_UID --source nextcloud --phone \"+40-744-444-444\"\n\n# Delete Nextcloud contact\nnexlink contacts delete --uid CONTACT_UID --source nextcloud\n```\n\n### Files (Nextcloud)\n\n```bash\n# List and search\nnexlink files list /Documents/\nnexlink files search contract /Clients/\n\n# Upload / Download\nnexlink files upload /local/report.pdf /Documents/\nnexlink files download /Documents/report.pdf /local/\n\n# Document understanding\nnexlink files extract-text /Clients/contract.docx\nnexlink files summarize /Clients/contract.docx\nnexlink files ask-file /Clients/contract.docx \"When is the renewal due?\"\n\n# Workflow extraction\nnexlink files extract-actions /Clients/contract.txt\nnexlink files create-tasks-from-file /Clients/contract.txt\nnexlink files create-tasks-from-file /Clients/contract.txt --select 1,2 --execute\n\n### YouTube Transcripts\n\nExtract video subtitles with automatic language fallback:\n\n```bash\n# Basic text transcript (English)\nnexlink youtube transcript https://www.youtube.com/watch?v=VIDEO_ID\n\n# Romanian transcript with JSON output (includes timestamps)\nnexlink youtube transcript https://youtu.be/VIDEO_ID --lang ro --format json\n\n# Try multiple languages, fall back in order\nnexlink youtube transcript VIDEO_ID --lang ro,en\n\n# Save transcript to Nextcloud\nnexlink youtube transcript VIDEO_ID --lang en --save\n\n# List available caption languages\nnexlink youtube languages https://www.youtube.com/watch?v=VIDEO_ID\n```\n\n**Note:** Requires `pip install youtube-transcript-api` for the underlying library.\n\n## Combined Workflows\n\n### Email + Files\n\nSend email with attachment from Nextcloud:\n\n```bash\n# Download from Nextcloud and send\nnexlink files download /Documents/offer.pdf /tmp/\nnexlink mail send --to \"client@example.com\" --subject \"Offer\" --body \"...\" --attach /tmp/offer.pdf\n```\n\nSave attachment from email to Nextcloud:\n\n```bash\n# Download attachment and upload to Nextcloud\nnexlink mail download-attachment --id EMAIL_ID --name \"contract.pdf\" --output /tmp/\nnexlink files upload /tmp/contract.pdf /Contracts/\n```\n\n### Calendar + Tasks\n\nCreate task from meeting request:\n\n```bash\n# After meeting, create follow-up task\nnexlink tasks create --subject \"Follow-up meeting X\" --due \"+3d\"\n```\n\n## Full Configuration\n\nSee [references/setup.md](references/setup.md) for detailed configuration.\n\n## Positioning public / branding\n\nFor public listings, documentation, and SEO copy, prefer this positioning:\n\n- **Public title:** `Firma de AI — Exchange & Nextcloud Assistant`\n- **Subtitle:** `Email, files, tasks, and document workflows for teams`\n- **Brand line:** `Built by Firma de AI, supported by Firma de IT.`\n- **Links:** `https://firmade.ai` and `https://firmade.it`\n\nThis keeps the internal skill name `nexlink` while making the public positioning more accurate and searchable.\n\n## Coding Standards\n\nThis project follows the [Hardshell Coding Standards](https://github.com/asistent-alex/openclaw-hardshell).\n\nWhen writing or modifying Python code, see:\n- **[Python Standards](https://github.com/asistent-alex/openclaw-hardshell/blob/main/references/languages/python.md)** - PEP 8, type hints, docstrings, security\n- **[Testing Standards](https://github.com/asistent-alex/openclaw-hardshell/blob/main/references/testing.md)** - TDD, test pyramid, coverage\n- **[Git Workflow](https://github.com/asistent-alex/openclaw-hardshell/blob/main/references/git-workflow.md)** - Conventional commits, PR process\n\nKey rules:\n\n- **PEP 8 formatting** - use `black` for formatting, `ruff` for linting\n- **Type hints** - required for all function parameters and return types\n- **Docstrings** - Google-style for all public functions and classes\n- **Testing** - `pytest` with `pytest-cov` for coverage\n- **Security** - never use `pickle` or `eval()` on untrusted input\n- **Dependencies** - use `uv` or `poetry`, pin versions, audit with `pip-audit`\n\n## Module Structure\n\n```\nmodules/\n├── exchange/           # Email, Calendar, Tasks (Exchange on-prem)\n│   ├── SKILL.md       # Module documentation\n│   ├── mail.py        # Email operations\n│   ├── cal.py         # Calendar operations\n│   ├── tasks.py       # Task operations\n│   ├── sync.py        # Sync and reminders\n│   └── ...\n├── nextcloud/          # File management, doc understanding, workflow extraction\n│   ├── SKILL.md       # Module documentation\n│   └── nextcloud.py   # File operations and analysis\n└── (future modules)\n```\n\n## Notes\n\n- Tasks are created in the default mailbox's Tasks folder or in the target mailbox when using delegate access\n- For collaborative tasks, use calendar events with attendees\n- Self-signed certificates require `verify_ssl: false`\n\n## License\n\nMIT License - see LICENSE file for details.\n\nFile v0.15.8:README.md\n\n<div align=\"center\">\n\n# 🔗 NexLink — Enterprise Connector for Nextcloud, Exchange & YouTube\n\n**Email, calendar, tasks, file management, document understanding, transcript extraction, contacts, and analytics**\n\n**Built by [Firma de AI](https://firmade.ai) · Supported by [Firma de IT](https://firmade.it)**\n\n[![Version](https://img.shields.io/badge/version-0.15.2-blue.svg)](https://github.com/asistent-alex/openclaw-nexlink)\n[![License: MIT-0](https://img.shields.io/badge/License-MIT--0-yellow.svg)](https://opensource.org/licenses/MIT)\n[![OpenClaw Skill](https://img.shields.io/badge/OpenClaw-Skill-green.svg)](https://clawhub.ai/asistent-alex/nexlink)\n[![Python 3.10+](https://img.shields.io/badge/python-3.10%2B-brightgreen.svg)](https://www.python.org/)\n[![Tests](https://img.shields.io/badge/tests-48%2F48%20passed-brightgreen.svg)](https://github.com/asistent-alex/openclaw-nexlink/actions)\n[![ClawHub](https://img.shields.io/badge/clawhub-nexlink-8A2BE2.svg)](https://clawhub.ai/asistent-alex/nexlink)\n[![Hardshell](https://img.shields.io/badge/code%20style-Hardshell-ff69b4.svg)](https://github.com/asistent-alex/openclaw-hardshell)\n[![GitHub](https://img.shields.io/badge/GitHub-Repo-181717.svg?logo=github)](https://github.com/asistent-alex/openclaw-nexlink)\n[![Security](https://img.shields.io/badge/security-audited-brightgreen.svg)](https://github.com/asistent-alex/openclaw-nexlink/blob/main/SECURITY.md)\n\n</div>\n\n---\n\n**NexLink** connects Nextcloud, Microsoft Exchange, and YouTube into one enterprise-grade workflow layer — with built-in security confirmations and least-privilege defaults.\n\n> **Public positioning:** *Firma de AI — Nextcloud, Exchange & YouTube Assistant*  \n> **CLI name:** `nexlink` · **Version:** `v0.15.2` · **License:** `MIT-0`\n\n### 🔗 Official Links\n\n| Resource | URL |\n|----------|-----|\n| 🏠 **Homepage** | [firmade.ai](https://firmade.ai) |\n| 📦 **GitHub Repository** | [github.com/asistent-alex/openclaw-nexlink](https://github.com/asistent-alex/openclaw-nexlink) |\n| 📋 **ClawHub Listing** | [clawhub.ai/asistent-alex/nexlink](https://clawhub.ai/asistent-alex/nexlink) |\n| 📖 **Documentation** | [github.com/asistent-alex/openclaw-nexlink#readme](https://github.com/asistent-alex/openclaw-nexlink#readme) |\n| 🔒 **Security Policy** | [github.com/asistent-alex/openclaw-nexlink/blob/main/SECURITY.md](https://github.com/asistent-alex/openclaw-nexlink/blob/main/SECURITY.md) |\n| 📝 **Changelog** | [github.com/asistent-alex/openclaw-nexlink/blob/main/CHANGELOG.md](https://github.com/asistent-alex/openclaw-nexlink/blob/main/CHANGELOG.md) |\n| 🐛 **Issues** | [github.com/asistent-alex/openclaw-nexlink/issues](https://github.com/asistent-alex/openclaw-nexlink/issues) |\n| 🔄 **Releases** | [github.com/asistent-alex/openclaw-nexlink/releases](https://github.com/asistent-alex/openclaw-nexlink/releases) |\n\n---\n\n## What it does\n\nThis skill connects Nextcloud, Exchange, and YouTube into one practical workflow layer for:\n\n- **Files** — list, search, upload, download, move, copy, info, sharing\n- **Document understanding** — extract text, summarize, ask questions about one file\n- **Workflow extraction** — extract actions from documents and create Exchange tasks\n- **YouTube** — transcript extraction with language fallback, text/JSON output, save to Nextcloud\n- **Email** — read, send, draft, reply, forward, attachments\n- **Calendar** — today, week, list, create, update, respond\n- **Tasks** — list, create, complete, trash, delegate workflows\n- **Sync & Reminders** — task sync with Exchange, email reminders, calendar linking\n- **Analytics** — inbox stats, response time, top senders, heatmap, reports\n\n## Why this is useful\n\nUse it when a team already works in **Nextcloud**, **Microsoft Exchange** and wants one assistant layer for:\n\n- file operations and sharing\n- turning documents into action items\n- extracting YouTube transcripts for meetings and research\n- inbox and follow-up workflows\n- meeting and task coordination\n\nBuilt by [Firma de AI](https://firmade.ai), supported by [Firma de IT](https://firmade.it).\n\n## Quick start\n\n### Current CLI name\n\nAfter installation, the command remains:\n\n```bash\nnexlink\n```\n\n### Typical first checks\n\n```bash\nnexlink mail connect\nnexlink files list /\nnexlink mail read --limit 5\nnexlink cal today\nnexlink tasks list\nnexlink analytics stats --days 7\nnexlink sync status\n```\n\n## Main capabilities\n\n### Exchange — Email, Calendar, Tasks, Analytics\n\nFull Exchange on-premises (2016/2019) workflows over EWS.\n\n| What you can do | Command |\n|---|---|\n| Read email | `nexlink mail read` · `nexlink mail read --unread` · `nexlink mail get --id X` |\n| Send email | `nexlink mail send --to x@y.com --subject \"Hello\" --body \"...\"` |\n| Reply / forward | `nexlink mail reply --id EMAIL_ID --body \"...\"` · `nexlink mail forward --id EMAIL_ID --to other@example.com` |\n| Download attachment | `nexlink mail download-attachment --id EMAIL_ID --name file.pdf` |\n| Mark unread mail as read | `nexlink mail mark-all-read` |\n| Today / week calendar | `nexlink cal today` · `nexlink cal week` |\n| Create meeting | `nexlink cal create --subject \"Meeting\" --start \"2026-04-20 14:00\" --duration 60` |\n| Create task | `nexlink tasks create --subject \"Follow-up\" --due \"+7d\" --priority high` |\n| List delegated tasks | `nexlink tasks list --mailbox coleg@firma.ro` |\n| Complete / trash task | `nexlink tasks complete --id TASK_ID` · `nexlink tasks trash --id TASK_ID` |\n| Create contact | `nexlink contacts create --name \"Jane Doe\" --email \"jane@example.com\"` |\n| Update contact | `nexlink contacts update --id CONTACT_ID --phone \"+40-722-000-000\"` |\n| Delete contact | `nexlink contacts delete --id CONTACT_ID` |\n| Search contacts | `nexlink contacts search --query \"Acme\"` |\n| Sync tasks | `nexlink sync sync` · `nexlink sync status` |\n| Send reminders | `nexlink sync reminders --hours 24` · `nexlink sync reminders --hours 24 --to owner@example.com` |\n| Link calendar event | `nexlink sync link-calendar --task-id TASK_ID` |\n| Inbox analytics | `nexlink analytics stats --days 30` |\n| Response time | `nexlink analytics response-time --days 7` |\n| Top senders | `nexlink analytics top-senders --limit 20` |\n| Activity heatmap | `nexlink analytics heatmap --days 30` |\n| Folder stats | `nexlink analytics folders` |\n| Full report | `nexlink analytics report --days 30` |\n\n> Delegate workflows are supported where Exchange permissions allow them.\n\n### Nextcloud — Files, Sharing, Document Understanding\n\nNextcloud workflows over WebDAV and OCS APIs.\n\n| What you can do | Command |\n|---|---|\n| List files | `nexlink files list /Documents/` |\n| Search files | `nexlink files search contract /Clients/` |\n| Upload / download | `nexlink files upload /local/report.pdf /Documents/` · `nexlink files download /Documents/report.pdf /tmp/` |\n| Create / move / copy | `nexlink files mkdir /Documents/New` · `nexlink files move /old /new` · `nexlink files copy /src /dst` |\n| File info | `nexlink files info /Documents/report.pdf` |\n| Shared items | `nexlink files shared` · `nexlink files share-list` |\n| List contacts | `nexlink contacts list --source nextcloud` |\n| Get contact | `nexlink contacts get --uid CONTACT_UID --source nextcloud` |\n| Create contact | `nexlink contacts create --source nextcloud --name \"Jane\" --email \"j@e.com\"` |\n| Update contact | `nexlink contacts update --uid CONTACT_UID --source nextcloud --phone \"...\"` |\n| Delete contact | `nexlink contacts delete --uid CONTACT_UID --source nextcloud` |\n| Search contacts | `nexlink contacts search --source nextcloud --query \"Jane\"` |\n| Create public links | `nexlink files share-create /Contracts/offer.pdf` |\n| Delete file / folder | `nexlink files delete /Documents/old` |\n| Extract text | `nexlink files extract-text /Clients/contract.docx` |\n| Summarize a file | `nexlink files summarize /Clients/contract.docx` |\n| Ask a file | `nexlink files ask-file /Clients/contract.docx \"When is the renewal due?\"` |\n| Extract actions | `nexlink files extract-actions /Clients/contract.txt` |\n| Create tasks from file | `nexlink files create-tasks-from-file /Clients/contract.txt --select 1,2 --execute` |\n\n### YouTube — Transcript Extraction\n\nExtract video captions/subtitles with automatic language fallback:\n\n| What you can do | Command |\n|---|---|\n| Get transcript (text) | `nexlink youtube transcript <url>` |\n| Get transcript (JSON) | `nexlink youtube transcript <url> --format json` |\n| Language fallback | `nexlink youtube transcript <url> --lang ro,en` |\n| Save to Nextcloud | `nexlink youtube transcript <url> --save` |\n| List available languages | `nexlink youtube languages <url>` |\n\nSupports all YouTube URL formats (watch, youtu.be, shorts, embed) and raw video IDs.\n\n### Combined workflows\n\n#### Send a Nextcloud file by email\n\n```bash\nnexlink files download /Documents/offer.pdf /tmp/\nnexlink mail send --to \"client@example.com\" --subject \"Offer\" --body \"Please see attached.\" --attach /tmp/offer.pdf\n```\n\n#### Save an email attachment into Nextcloud\n\n```bash\nnexlink mail download-attachment --id EMAIL_ID --name \"contract.pdf\" --output /tmp/\nnexlink files upload /tmp/contract.pdf /Contracts/\n```\n\n#### Turn a document into follow-up tasks\n\n```bash\nnexlink files extract-actions /Clients/contract.txt\nnexlink files create-tasks-from-file /Clients/contract.txt --select 1,2 --execute\n```\n\n## Configuration\n\n### Exchange\n\n```bash\nexport EXCHANGE_SERVER=\"https://mail.your-domain.com/EWS/Exchange.asmx\"\nexport EXCHANGE_USERNAME=\"service-account\"\nexport EXCHANGE_PASSWORD=\"your-password\"\nexport EXCHANGE_EMAIL=\"service-account@your-domain.com\"\nexport OWNER_EMAIL=\"owner@your-domain.com\"  # Optional: recipient for notifications (defaults to EXCHANGE_EMAIL)\nexport EXCHANGE_VERIFY_SSL=\"false\"   # only for self-signed certificates\n```\n\n### Nextcloud\n\n```bash\nexport NEXTCLOUD_URL=\"https://cloud.your-domain.com\"\nexport NEXTCLOUD_USERNAME=\"your-username\"\nexport NEXTCLOUD_APP_PASSWORD=\"your-app-password\"\n```\n\nFor full setup details, see [references/setup.md](references/setup.md).\n\n## Changelog\n\nSee [CHANGELOG.md](CHANGELOG.md) for the full version history. Latest: v0.14.1.\n\n## Installation options\n\n### From Git\n\n```bash\ncd ~/.openclaw/skills/\ngit clone https://github.com/asistent-alex/openclaw-nexlink.git\ncd openclaw-nexlink\npip3 install -r requirements.txt\n```\n\n### From ClawHub\n\nUse the published listing/slug once the public package is live on ClawHub. The public title is intended to be:\n\n**Firma de AI — Nextcloud, Exchange & YouTube Assistant**\n\nThe CLI command remains:\n\n```bash\nnexlink\n```\n\n## Brand positioning\n\nFor public listings, release notes, and marketing copy, prefer:\n\n- **Title:** Firma de AI — Nextcloud, Exchange & YouTube Assistant\n- **Subtitle:** Email, files, tasks, transcripts, and document workflows for teams\n- **Brand line:** Built by Firma de AI, supported by Firma de IT.\n- **Links:** https://firmade.ai · https://firmade.it\n\n## License\n\nMIT — see [LICENSE](LICENSE).\n\nThis project follows the [Hardshell Coding Standards](https://github.com/asistent-alex/openclaw-hardshell).\n\n---\n\n<div align=\"center\">\n\n**Built by [Firma de AI](https://firmade.ai), supported by [Firma de IT](https://firmade.it)**  \n*Nextcloud, Exchange, YouTube — one assistant.*\n\n[Hardshell](https://github.com/asistent-alex/openclaw-hardshell) · [prompt-to-pr](https://github.com/asistent-alex/openclaw-prompt-to-pr) · [Report Bug](https://github.com/asistent-alex/openclaw-nexlink/issues) · [Request Feature](https://github.com/asistent-alex/openclaw-nexlink/issues)\n\n</div>\n\nFile v0.15.8:_meta.json\n\n{\n  \"ownerId\": \"kn79j1bsq3gg7dhe829cx763g983x4dy\",\n  \"slug\": \"nexlink\",\n  \"version\": \"0.15.8\",\n  \"publishedAt\": 1777645502057\n}\n\nFile v0.15.8:references/security-best-practices.md\n\n# Security Best Practices for NexLink\n\n## Dedicated Least-Privilege Accounts\n\n### Exchange\n\n**DO NOT use personal accounts.** Use a dedicated service account with minimal permissions:\n\n1. **Create a dedicated Exchange mailbox** (e.g., `nexlink-svc@your-domain.com`)\n2. **Grant delegate access** only to the specific folders NexLink needs:\n   - Inbox (read/send)\n   - Calendar (read/write)\n   - Tasks (read/write)\n   - Contacts (read/write)\n3. **Avoid using an account with Domain Admin privileges**\n4. **Enable MFA on the service account** and use an app password for NexLink\n\n### Nextcloud\n\n**DO NOT use your personal Nextcloud account.** Create a dedicated user with scoped permissions:\n\n1. **Create a dedicated Nextcloud user** (e.g., `nexlink`)\n2. **Grant access only to specific group folders**:\n   ```bash\n   # Example: allow access only to /NexLink folder\n   # Set up via Nextcloud admin panel → Group Folders\n   ```\n3. **Generate an app password** — never use the main password\n4. **Restrict to WebDAV/CardDAV endpoints only**\n\n### Credential Rotation\n\n| Credential | Rotation Frequency |\n|------------|-------------------|\n| Exchange app password | Every 90 days |\n| Nextcloud app password | Every 90 days |\n| Exchange service account password | Every 180 days |\n\n## Environment Variable Security\n\n**NEVER commit credentials to version control.** Use one of these patterns:\n\n```bash\n# Option 1: Export in shell profile (secure on single-user systems)\nexport EXCHANGE_PASSWORD=\"...\"   # ~/.bashrc or ~/.zshrc\n\n# Option 2: Use OpenClaw secrets management (recommended)\n# Store in OpenClaw vault and reference as ${EXCHANGE_PASSWORD}\n\n# Option 3: Use a secrets manager (HashiCorp Vault, 1Password CLI, etc.)\nexport EXCHANGE_PASSWORD=\"$(op read 'op://vault/item/password')\"\n```\n\n**Check for credential leaks:**\n```bash\ngrep -rn \"EXCHANGE_PASSWORD\\|NEXTCLOUD_APP_PASSWORD\" ~/.openclaw/skills/nexlink/ --include=\"*.py\" --include=\"*.md\"\n# Should only appear in config.template.yaml (with placeholder values) and documentation\n```\n\n## Confirmation Prompts\n\nAll destructive operations require confirmation. To run a single operation in automation:\n\n```bash\nnexlink mail send --to \"client@example.com\" --subject \"...\" --yes\n```\n\n**Warning:** `--yes` / `-y` bypasses confirmation for **only that one command**. For multiple operations, add `--yes` to each one.\n\n## Branding Opt-Out\n\nTo suppress \"Built by Firma de AI\" in generated outputs:\n\n```bash\n# CLI flag\nnexlink --no-branding analytics report --days 30\n\n# Environment variable\nexport NEXLINK_NO_BRANDING=1\n```\n\n## Audit Trail\n\nEnable logging for accountability:\n\n```bash\n# Set log level for NexLink operations\nexport NEXLINK_LOG_LEVEL=INFO    # DEBUG, INFO, WARNING, ERROR\n```\n\nLogs are written to `~/.openclaw/skills/nexlink/logs/nexlink.log`.\n\n## Memory / Persistence\n\nNexLink uses the LCM (Lossless Context Memory) plugin for persistent context.\n\n**What gets stored:**\n- Command history\n- File metadata (names, paths, sizes)\n- Task/calendar IDs (for follow-up operations)\n- Contact IDs\n- **NOT** raw email content, file contents, or passwords\n\n**How to clear:**\n```bash\n# Clear all NexLink memory (requires confirmation)\nnexlink memory clear --yes\n\n# Alternative: use the built-in reset command\nnexlink memory reset --confirm\n```\n\n**⚠️ Always use `--yes` or `--confirm` for destructive operations.**\n\n**To opt out of persistent memory:**\n```bash\nexport NEXLINK_NO_MEMORY=1\n```\n\n## Reporting Security Issues\n\nSee [SECURITY.md](../SECURITY.md) for vulnerability reporting.\n\n---\n\n_Last updated: 2026-04-30_\n\nFile v0.15.8:references/setup.md\n\n# NexLink Setup Guide\n\nGhid practic de instalare, configurare și verificare pentru skill-ul NexLink.\n\n## Cuprins\n\n1. [Cerințe de sistem](#cerințe-de-sistem)\n2. [Instalare](#instalare)\n3. [Configurare Exchange](#configurare-exchange)\n4. [Configurare Nextcloud](#configurare-nextcloud)\n5. [Verificare rapidă](#verificare-rapidă)\n6. [Troubleshooting](#troubleshooting)\n\n## Cerințe de sistem\n\n- Python 3.10+\n- OpenClaw instalat și configurat\n- Exchange Server 2016/2019 (on-premises) pentru modulele Exchange\n- Nextcloud pentru modulul `files`\n- Acces de rețea la serviciile de mai sus\n\n## Instalare\n\n### Varianta recomandată: prin ClawHub\n\n```bash\nclawhub install nexlink\n```\n\n### Varianta manuală: din Git\n\n```bash\ncd ~/.openclaw/skills/\ngit clone https://github.com/asistent-alex/openclaw-nexlink.git\ncd openclaw-nexlink\npip install -r requirements.txt\n```\n\n## Configurare Exchange\n\n### Variabile de mediu\n\n```bash\nexport EXCHANGE_SERVER=\"https://mail.your-domain.com/EWS/Exchange.asmx\"\nexport EXCHANGE_USERNAME=\"service-account\"\nexport EXCHANGE_PASSWORD=\"your-password\"\nexport EXCHANGE_EMAIL=\"service-account@your-domain.com\"\nexport EXCHANGE_VERIFY_SSL=\"false\"   # doar pentru certificate self-signed\n```\n\n### Fișier de configurare\n\nPoți folosi și `config.yaml` în rădăcina skill-ului:\n\n```yaml\nexchange:\n  server: https://mail.your-domain.com/EWS/Exchange.asmx\n  username: ${EXCHANGE_USERNAME}\n  password: ${EXCHANGE_PASSWORD}\n  email: service-account@your-domain.com\n  verify_ssl: false\n```\n\n### Verificare Exchange\n\n```bash\nnexlink mail connect\nnexlink cal today\nnexlink tasks list\n```\n\n## Configurare Nextcloud\n\n### Variabile de mediu\n\n```bash\nexport NEXTCLOUD_URL=\"https://cloud.your-domain.com\"\nexport NEXTCLOUD_USERNAME=\"your-username\"\nexport NEXTCLOUD_APP_PASSWORD=\"your-app-password\"\n```\n\n### Cum obții un App Password\n\n1. Intră în Nextcloud\n2. Mergi la **Settings → Security → Devices & sessions**\n3. Creează un nou **app password**\n4. Folosește parola generată în `NEXTCLOUD_APP_PASSWORD`\n\n### Verificare Nextcloud\n\n```bash\nnexlink files list /\nnexlink files search contract /Clients/\nnexlink files summarize /Clients/contract.docx\nnexlink files extract-actions /Clients/contract.txt\n```\n\n## Verificare rapidă\n\nRulează din repo sau după instalarea CLI-ului:\n\n```bash\n# Exchange\nnexlink mail connect\nnexlink mail read --limit 5\nnexlink cal today\nnexlink tasks list\nnexlink analytics stats --days 7\n\n# Nextcloud\nnexlink files list /\nnexlink files search contract /Clients/\nnexlink files extract-text /Clients/contract.docx\nnexlink files summarize /Clients/contract.docx\nnexlink files ask-file /Clients/contract.docx \"When is the renewal due?\"\nnexlink files extract-actions /Clients/contract.txt\nnexlink files create-tasks-from-file /Clients/contract.txt\nnexlink files share-list\nnexlink files shared\n```\n\n### Observație importantă despre task-uri\n\nPentru task-uri, comanda sigură de eliminare este:\n\n```bash\nnexlink tasks trash --id TASK_ID\n```\n\nNu documenta `tasks delete` pentru Exchange tasks în acest repo.\n\n## Troubleshooting\n\n### Exchange SSL error\n\n```text\nSSL: CERTIFICATE_VERIFY_FAILED\n```\n\n**Soluție:** setează `EXCHANGE_VERIFY_SSL=\"false\"` doar dacă folosești certificate self-signed.\n\n### Exchange authentication failed\n\n```text\nUnauthorized\n```\n\nVerifică:\n1. username-ul\n2. parola\n3. că mailbox-ul există și are accesul necesar\n\n### Nextcloud 401 Unauthorized\n\n```text\n401 Unauthorized\n```\n\nVerifică:\n1. URL-ul complet (`https://...`)\n2. username-ul\n3. app password-ul, nu parola principală\n\n### Module import / path issues\n\nDacă rulezi direct din repo și ai probleme de path, folosește entrypoint-ul unificat:\n\n```bash\ncd ~/.openclaw/skills/openclaw-nexlink\npython3 scripts/nexlink.py mail connect\n```\n\nsau, dacă scriptul este instalat în PATH:\n\n```bash\nnexlink mail connect\n```\n\n## Configurație completă exemplu\n\n```yaml\nexchange:\n  server: https://mail.your-domain.com/EWS/Exchange.asmx\n  username: service-account\n  password: ${EXCHANGE_PASSWORD}\n  email: service-account@your-domain.com\n  verify_ssl: false\n\nnextcloud:\n  url: https://cloud.your-domain.com\n  username: your-username\n  app_password: ${NEXTCLOUD_APP_PASSWORD}\n```\n\nFile v0.15.8:ABOUT.md\n\n# About NexLink\n\n## What is NexLink?\n\nNexLink is an OpenClaw skill that connects **Microsoft Exchange** and **Nextcloud** into one practical workflow layer. It gives teams a single assistant interface for email, calendar, tasks, file management, and document understanding.\n\n## Built for Teams That Use Exchange + Nextcloud\n\nIf your organization runs **Microsoft Exchange** (on-premises or hybrid) and **Nextcloud** for file storage, NexLink eliminates the context switching between mail client, calendar, task manager, and file browser.\n\n## What You Can Do\n\n| Area | Actions |\n|------|---------|\n| **Email** | Read, send, draft, reply, forward, download attachments |\n| **Calendar** | View today/week, create meetings, respond to invites |\n| **Tasks** | List, create, complete, trash — including delegate workflows |\n| **Analytics** | Inbox stats, response time, top senders, heatmaps |\n| **Files** | List, search, upload, download, move, copy, share |\n| **Documents** | Extract text, summarize, ask questions, extract action items |\n\n## Key Workflows\n\n- **Send a Nextcloud file by email** — download from Nextcloud, attach to Exchange email\n- **Save email attachments to Nextcloud** — download from Exchange, upload to Nextcloud\n- **Turn documents into tasks** — extract action items from contracts, create Exchange tasks\n- **Delegate task management** — manage tasks for team members with proper Exchange permissions\n\n## How It Works\n\nNexLink uses:\n- **EWS (Exchange Web Services)** for Exchange operations\n- **WebDAV + OCS APIs** for Nextcloud file operations\n- **OpenClaw skill framework** for integration with the assistant layer\n\n## Requirements\n\n- Python 3.10+\n- Exchange Server 2016/2019 (on-premises) or hybrid\n- Nextcloud instance with app password access\n- Network access to both services\n\n## Brand\n\n**Built by [Firma de AI](https://firmade.ai), supported by [Firma de IT](https://firmade.it).**\n\n## License\n\nMIT — see [LICENSE](LICENSE).\n\nFile v0.15.8:BRAND.md\n\n# Brand Guidelines — NexLink\n\n_All assets, messages, and outputs from this project must follow these rules._\n\n## Branding Opt-Out\n\nBranding is **on by default** for public outputs (email digests, reports, analytics).\n\n**To disable branding:**\n- CLI: pass `--no-branding` before the module (`nexlink --no-branding mail send ...`)\n- Env: `export NEXLINK_NO_BRANDING=1`\n- Agent config: set `NEXLINK_NO_BRANDING=1` in environment\n\nWhen branding is disabled, outputs must **not** include firmade.ai / firmade.it links or \"Built by Firma de AI\" text.\n\n---\n\n## 1. Brand Line (Obligatoriu)\n\n**EN:**\n\n> Built by [Firma de AI](https://firmade.ai), supported by [Firma de IT](https://firmade.it)\n\n**RO:**\n\n> Construit de [Firma de AI](https://firmade.ai), susținut de [Firma de IT](https://firmade.it)\n\nAceastă frază apare în:\n- README.md (subtitlu + footer)\n- Email digests (header + footer)\n- Orice output public (rapoarte, pagini, documentație)\n\n### Reguli\n\n1. **Întotdeauna cu link-uri** — Numele firmei e mereu hyperlink, niciodată text gol.\n2. **Fără `www.`** — `https://firmade.ai` și `https://firmade.it`, niciodată cu `www.`\n3. **Ordinea e fixă** — Firma de AI primează (built by), Firma de IT urmează (supported by).\n4. **Nu inversa rolurile** — Firma de AI = build/develop/create, Firma de IT = support/infrastructure/backing.\n5. **Nu alterna sinonime** — Nu folosi \"made by\", \"created by\", \"powered by\" etc. Stick to \"built by\" și \"supported by\".\n\n---\n\n## 2. Tagline-ul Produsului\n\n**EN:**\n\n> Exchange, Nextcloud, GitHub — one assistant.\n\nAceasta e headline-ul produsului. Menționează mereu cele 3 integrări principale.\n\n### Variante permise\n\n| Context | Variantă |\n|---------|----------|\n| README header | Exchange, Nextcloud, GitHub — one assistant. Built by Firma de AI, supported by Firma de IT |\n| Email digest | GitHub Releases Digest — Built for teams using Firma de AI and supported by Firma de IT |\n| Footer scurt | Built by Firma de AI · Supported by Firma de IT · Made with ☕ in România |\n| Social/bio | OpenClaw skill for Romanian SMEs — Exchange, Nextcloud, GitHub in one assistant |\n\n---\n\n## 3. Numele Firmelor\n\n| Firmă | URL | Rol în brand line |\n|-------|-----|-------------------|\n| **Firma de AI** | https://firmade.ai | built by (creator, dezvoltator) |\n| **Firma de IT** | https://firmade.it | supported by (infrastructură, suport) |\n\n### Formate greșite ❌\n\n- `www.firmade.ai` / `www.firmade.it`\n- `Firma De AI` / `FIRMA DE IT`\n- `firma de ai` / `firma de it` (lowercase, cu excepția URL-urilor)\n- `FirmadeAI` / `FirmadeIT` (fără spațiu)\n\n---\n\n## 4. Culori Brand\n\n| Element | Culoare | Hex |\n|---------|---------|-----|\n| Firma de AI badge | Indigo | `#6366f1` |\n| Firma de IT badge | Sky blue | `#0ea5e9` |\n| Email hero (updates) | Blue | `#1d4ed8` |\n| Email hero (no updates) | Teal | `#134e4a` |\n| Email hero (errors) | Dark red | `#7f1d1d` |\n| Card background | White | `#ffffff` |\n| Page background | Light gray | `#f4f6f8` |\n\n---\n\n## 5. Email Digest Branding\n\n### Header\n\n- Brand line cu link-uri către ambele firme\n- Hero section cu background adaptiv (teal/blue/red după status)\n- \"Useful AI intelligence for Romanian teams\" ca subtitlu\n\n### Footer\n\n- \"Generated by NexLink MSP GitHub checker\" + link GitHub repo\n- Link Firma de AI + link Firma de IT\n- Separator vizual (border-top 3px)\n\n### Reguli email\n\n- **Outlook-compatible HTML** — tabele cu `role=\"presentation\"`, inline styles, fără CSS classes\n- **Fără JavaScript** — emailul trebuie să funcționeze fără scripting\n- **Dark/light adaptiv** — hero-ul se schimbă după status, dar textul rămâne lizibil\n\n---\n\n## 6. Tone of Voice\n\n- **RO pentru utilatori români**, EN pentru documentație tehnică\n- Practic, direct, fără hype gol\n- \"Made with ☕ in România\" e un touch permis — nu overdo it\n- Evită superlative goale: \"revolutionar\", \"uimitor\", \"incredibil\"\n- Fii specific: în loc de \"performanță excelentă\", scrie \"răspuns sub 2 secunde\"\n\n---\n\n## 7. Checklist pentru Output Nou\n\nOrice output public (email, raport, pagină, README) trebuie să verifice:\n\n- [ ] Brand line prezentă cu link-uri corecte (fără `www.`)\n- [ ] Ordinea corectă: Firma de AI → Firma de IT\n- [ ] Tagline-ul produsului menționează integrările (Exchange, Nextcloud, GitHub)\n- [ ] Culorile respectă paleta de mai sus\n- [ ] Email HTML e Outlook-compatible\n- [ ] Numele firmelor sunt corect capitalizate\n\n---\n\n_This document is the source of truth for all branding decisions in NexLink._\n_Last updated: 2026-04-09_\n\nFile v0.15.8:CHANGELOG.md\n\n# Changelog\n\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),\nand this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n\n## [Unreleased]\n\n### Security (ClawScan Findings — All Phases)\n\n**Phase 1 — Per-command --yes only + Pinned dependencies**\n- **Removed session-wide `NEXLINK_AUTO_APPROVE`** — `--yes` / `-y` is now strictly **per-command**\n  - `utils.confirm_or_die()` no longer checks env var; uses `auto_approved` kwarg only\n  - `--yes` must be appended to each individual command; there is no env bypass\n  - Nextcloud `run_cli()` uses module-level `_AUTO_APPROVED` instead of env\n  - Exit code changed from 1 → 2 on non-confirmation\n  - Tests updated for new behavior\n- **Pinned all pip dependencies** to exact versions in `SKILL.md` + `requirements.txt`\n  - `exchangelib==5.6.0`, `requests-ntlm==1.3.0`, `defusedxml==0.7.1`, `requests==2.31.0`, `lxml==6.0.2`\n\n**Phase 2 — Branding opt-out simplification**\n- Removed `--no-branding` global flag and `NEXLINK_NO_BRANDING` env var references from CLI\n- Branding is controlled by skill modules at output generation level (not CLI)\n- Usage text updated; references to `NEXLINK_NO_BRANDING` removed from security docs\n\n**Phase 3 — Data handling: permissions + disclosure**\n- **Config file permissions**: `config.save()` now sets `chmod 0o600` on saved config files\n- **Log file permissions**: `logger.py` now creates log directory `0o700` and log files `0o600`\n- **Sync state permissions**: `save_sync_state()` sets `0o600` on state file and `0o700` on parent dir\n- Added comment in `config.template.yaml` about permission expectations for state file directory\n- **Password handling**: config.save() already strips password from written file; added audit comment\n- **Logging credentials**: NexLink does NOT log credentials or raw email content to log files\n\n**Phase 4 — Documentation & disclosure**\n- `SECURITY.md`: Updated security model, removed `NEXLINK_AUTO_APPROVE` references\n- `references/security-best-practices.md`: Removed `NEXLINK_AUTO_APPROVE` docs, kept per-command `--yes`\n- `CHANGELOG.md`: This comprehensive entry for audit trail\n\n## [0.15.0] - 2026-04-30\n\n### Security (ClawScan Audit Remediation)\n\n- **Prompt Approval System** — all destructive operations now require explicit confirmation\n  - 29 operations guarded: send, reply, forward, create/delete event, respond meeting, create/complete/trash task, create/update/delete contact, sync, link-calendar, delete/move/copy file, share-revoke, create-tasks-from-file --execute\n  - Global `--yes` / `-y` flag for non-interactive bypass\n  - `NEXLINK_AUTO_APPROVE=1` environment variable for session-wide bypass\n  - Non-TTY fallback: JSON error with clear instructions to use `--yes`\n  - 8 new unit tests covering TTY, non-TTY, env var, abort scenarios (all passing)\n- **SECURITY.md** — GitHub-standard vulnerability disclosure policy with coordinated disclosure timeline (2 days acknowledgment, 5 days assessment, 30 days fix, 90 days disclosure)\n- **references/security-best-practices.md** — comprehensive least-privilege deployment guide (dedicated accounts, credential rotation, network isolation, logging, monitoring)\n- **Opt-out controls**:\n  - `--no-branding` / `NEXLINK_NO_BRANDING=1` — suppress branding in outputs\n  - `--no-memory` / `NEXLINK_NO_MEMORY=1` — opt-out of LCM persistent memory\n- **requirements.lock** — fully pinned dependencies for reproducible builds\n\n### Added\n\n- GitHub repository link in SKILL.md description for official branding\n- Professional header in README.md with official links table\n- `clawhub.json` enhanced with badges, keywords, and full link portfolio\n- `BRAND.md` updated with opt-out instructions\n\n### Changed\n\n- **Version**: 0.14.1 → **0.15.0** (minor bump — new security features, backward compatible)\n- **Name**: \"NexLink — Nextcloud, Exchange & YouTube Connector\" → \"NexLink — Enterprise Connector for Nextcloud, Exchange & YouTube\"\n\n### Verification\n\n- ✅ 48/48 unit tests passing\n- ✅ 9 real-world scenarios validated\n- ✅ Zero breaking changes\n- ✅ ClawScan security audit: 7/7 findings remediated\n\n---\n\n## [0.14.1] - 2026-04-29\n\n### Changed\n\n- Version bump to v0.14.1 for release\n\n## [0.13.0] - 2026-04-29\n\n### Added\n\n- **YouTube Transcript Extraction** — full module with `nexlink youtube transcript` and `nexlink youtube languages` commands\n- Supports all URL formats (watch, youtu.be, shorts, embed) and raw video IDs\n- Automatic language fallback (e.g. `--lang ro,en`)\n- Output formats: text (plain) and JSON (timestamped snippets)\n- Save to Nextcloud with `--save` flag (saves to `/Alex's Assistant/YouTube/`)\n- Comprehensive test suite: 23 tests covering ID extraction, error handling, formatting, live API, and CLI integration\n\n## [0.12.0] - 2026-04-28\n\n### Added\n\n- **Exchange contacts module** — full CRUD + search via EWS\n  - `nexlink contacts list|get|create|update|delete|search`\n  - Server-side search with Q() filter (display_name, given_name, surname, company_name, email)\n  - Safe delete via `move_to_trash()`\n- **Nextcloud contacts module** — CardDAV contacts with auto-discovered principal\n  - `nexlink contacts addressbooks|list|get|create|update|delete|search --source nextcloud`\n  - vCard ↔ dict conversion\n  - Automatic DAV principal discovery (handles GUID-based principals)\n  - Cached principal resolution (avoids PROPFIND per call)\n- **Integration tests** — 11 Exchange live + 12 Nextcloud live tests\n\n### Fixed\n\n- **`_get_contacts_folder`** was returning `account.contacts.root` (MailFolder) instead of `account.contacts`\n- **`ContactPhoneNumbers` removed in exchangelib 5.x** — use `List[PhoneNumber]` with `label` + `phone_number`\n- **`EmailAddress` import path** — `email_addresses` accepts `List[EmailAddress]` objects, not dicts\n- **`PhysicalAddress` moved to `exchangelib.indexed_properties`** — import from `exchangelib.properties` raised `ImportError`\n- **Nextcloud DAV principal mismatch** — `_dav_base_path()` used login username but Nextcloud may use a GUID; now auto-discovers via PROPFIND\n\n## [0.11.0] - 2026-04-25\n\n### Added\n\n- **OWNER_EMAIL config variable** — optional env var for notification recipient\n  - Priority chain: `--to` flag > `OWNER_EMAIL` > `account.primary_smtp_address`\n  - Defaults to `EXCHANGE_EMAIL` when not set (backward compatible)\n  - Documented in SKILL.md env vars list\n- **Integration tests for OWNER_EMAIL fallback** — 3 new tests in `TestOwnerEmailFallback`\n  - `test_reminder_uses_owner_email` — verifies OWNER_EMAIL is used as recipient\n  - `test_reminder_falls_back_to_account_email` — verifies fallback to Exchange account\n  - `test_reminder_explicit_to_overrides_owner_email` — verifies `--to` flag priority\n- **Integration tests for Exchange sync operations** — 15 new tests covering sync, error handling, and reminder flows\n\n### Changed\n\n- `cmd_reminders` now resolves recipient via `get_connection_config()` instead of `account.primary_smtp_address` directly\n\n## [0.9.0] - 2026-04-22\n\n### Changed\n\n- **Complete rebrand: imm-romania → NexLink**\n  - Skill name, CLI command, folder, script, all references updated\n  - GitHub repo renamed to `openclaw-nexlink`\n  - ClawHub slug: `nexlink`\n  - Public name: **NexLink — Exchange & Nextcloud Connector**\n  - Built by Firma de AI, supported by Firma de IT\n\n## [0.5.1] - 2026-04-11\n\n### Added\n\n- **Nextcloud document understanding**\n  - `extract-text` for supported text, DOCX, and PDF files\n  - `summarize` for grounded one-file summaries\n  - `ask-file` for extractive Q&A over a single file\n- **Nextcloud workflow intelligence**\n  - `extract-actions` for grounded action extraction with due-date and owner hints\n  - `create-tasks-from-file` to create Exchange tasks from extracted file actions\n\n### Changed\n\n- **Product boundary cleanup**\n  - NexLink now focuses on Exchange + Nextcloud only\n  - MSP runtime, scripts, tests, and examples were removed from this repo\n  - MSP logic now lives in a separate dedicated skill\n- **Documentation refresh**\n  - README, SKILL, setup guide, and verification docs now describe the current CLI accurately\n- **Packaging metadata**\n  - version metadata aligned to `0.4.0`\n  - setup metadata updated for the current CLI script and recommended PDF dependency\n\n### Fixed\n\n- Unified CLI help now reflects the final Nextcloud command surface after cleanup and integration\n- Release metadata inconsistencies across `SKILL.md`, `README.md`, `VERIFICATION.md`, and `setup.py`\n\n## [0.2.0] - 2026-03-30\n\n### Added\n\n- **Task Sync Module**: Bidirectional sync with Exchange server\n  - `sync sync` - Synchronize tasks with server\n  - `sync status` - Show sync statistics\n  - `sync reminders` - Email reminders for overdue/upcoming tasks\n  - `sync link-calendar` - Create calendar event from task\n- **Hardshell Coding Standards**: Applied to all Exchange modules\n  - Black formatting (PEP 8)\n  - Ruff linting (fixed unused imports)\n  - Comprehensive test suite (24 tests passing)\n- **Module Organization**: Clean separation of concerns\n  - `modules/exchange/` - Email, Calendar, Tasks, Sync\n  - `modules/nextcloud/` - File management\n  - `scripts/nexlink.py` - Unified CLI entry point\n- **Documentation**: Setup guide, skill docs, coding standards\n\n### Fixed\n\n- Test imports for module paths\n- CLI execution path in tests\n- Duplicate function definitions removed\n\n## [0.1.0] - 2026-03-30\n\n### Added - Initial Release\n\n- Email operations: connect, read, get, send, draft, reply, forward, mark, attachments\n- Calendar operations: connect, list, today, week, get, create, update, delete, respond, availability\n- Tasks operations: connect, list, get, create, update, complete, delete\n- Unified CLI with `nexlink mail|calendar|tasks` commands\n- Configuration via environment variables or config file\n- Self-signed certificate support via `verify_ssl: false`\n- MIT License\n- GitHub issue templates and PR template\n\n## [2.0.0-alpha] - 2026-03-30\n\n### Added - Meta-Skill Architecture\n\n**Breaking Change**: Restructured as meta-skill with modular architecture.\n\n- **Modules**: Separated Exchange and Nextcloud into independent modules\n- **Exchange Module**: Email, Calendar, Tasks operations (moved from root)\n- **Nextcloud Module**: File management via WebDAV (new)\n- **Memory Integration**: Documentation for LCM plugin integration\n- **Unified CLI**: New orchestrator `nexlink.py` for all modules\n\n### Added - Exchange Module\n\n- All previous email, calendar, and tasks functionality\n- Task sync with Exchange server\n- Email reminders for overdue/upcoming tasks\n- Calendar event creation from tasks\n- Logging system with JSON and colored output\n- Complete test suite (9 tests passing)\n\n### Added - Nextcloud Module\n\n- File operations: upload, download, list, delete, move, copy\n- Directory creation and management\n- Automatic user ID resolution for WebDAV paths\n- Error handling with specific exit codes\n\n### Added - Memory (LCM Plugin)\n\n- Documentation for Lossless Context Management plugin\n- Instructions for persistent conversation history\n- Tool descriptions: `lcm_grep`, `lcm_describe`, `lcm_expand_query`\n\n### Added - Workflow Integrations\n\n- Email + Files: Send attachments from Nextcloud\n- Email + Files: Save attachments to Nextcloud\n- Calendar + Tasks: Create calendar events from tasks\n- Memory + All: Context-aware operations\n\n### Changed - Architecture\n\n- **Before**: Single skill with Exchange only\n- **After**: Meta-skill orchestrating multiple modules\n  - `modules/exchange/` - Email, Calendar, Tasks\n  - `modules/nextcloud/` - File management\n  - `references/setup.md` - Complete setup guide\n  - `assets/config.template.yaml` - Configuration template\n\n### Changed - Documentation\n\n- New SKILL.md as meta-skill documentation\n- Per-module SKILL.md files\n- Comprehensive setup guide in `references/setup.md`\n- Updated README with module structure\n\n### Migration Guide (1.x to 2.0)\n\nIf upgrading from 1.x:\n\n1. Update imports:\n   ```python\n   # Before\n   from scripts.mail import MailClient\n   \n   # After\n   from modules.exchange.mail import MailClient\n   ```\n\n2. Update CLI commands:\n   ```bash\n   # Before\n   python3 scripts/mail.py connect\n   \n   # After\n   python3 scripts/nexlink.py mail connect\n   # Or simply\n   nexlink mail connect\n   ```\n\n3. New environment variables for Nextcloud:\n   ```bash\n   export NEXTCLOUD_URL=\"https://cloud.example.com\"\n   export NEXTCLOUD_USERNAME=\"your-username\"\n   export NEXTCLOUD_APP_PASSWORD=\"your-app-password\"\n   ```\n\n---\n\n## [1.0.0] - 2026-03-30\n\n### Added\n\n- Email operations: connect, read, get, send, draft, reply, forward, mark, attachments\n- Calendar operations: connect, list, today, week, get, create, update, delete, respond, availability\n- Tasks operations: connect, list, get, create, update, complete, delete\n- Unified CLI with `nexlink mail|calendar|tasks` commands\n- Configuration via environment variables or config file\n- Self-signed certificate support via `verify_ssl: false`\n- MIT License\n- GitHub issue templates and PR template\n\n### Security\n\n- Credentials only from environment variables (never hardcoded)\n- SSL verification configurable for self-signed certificates\n\n---\n\n## [Unreleased]\n\n### Planned\n\n- Distribution lists management\n- Room booking\n- Delegate access support (full)\n- Docker deployment\n\nFile v0.15.8:CONTRIBUTING.md\n\n# Contributing to OpenClaw NexLink\n\nThank you for your interest in contributing!\n\n## Development Standards\n\nThis project follows the [Hardshell Coding Standards](https://github.com/asistent-alex/openclaw-hardshell).\n\n### Quick Reference\n\n- **Security**: Validate all input, no secrets in code, HTTPS everywhere\n- **Architecture**: SOLID principles, separation of concerns\n- **Testing**: TDD with 70% minimum coverage\n- **Git**: Conventional commits, feature branches\n\n## Running Checks\n\n```bash\n# Format code\nblack modules/ tests/\n\n# Lint\nruff check modules/ tests/\n\n# Type check (optional)\nmypy modules/\n\n# Run tests\nPYTHONPATH=modules/exchange pytest tests/ -v\n\n# Run tests with coverage\nPYTHONPATH=modules/exchange pytest tests/ --cov=modules --cov-report=html\n```\n\n## Branch Strategy\n\n- `main` - always deployable, protected\n- `feature/<slug>` - short-lived feature branches\n- `fix/<slug>` - bug fix branches\n- `alpha-testing` - integration testing\n\n## Commit Format\n\nUse [Conventional Commits](https://www.conventionalcommits.org/):\n\n```\n<type>(<scope>): <short description>\n\nTypes: feat, fix, docs, style, refactor, test, chore\n```\n\nExamples:\n- `feat(mail): add attachment support`\n- `fix(calendar): handle timezone correctly`\n- `docs(readme): update installation instructions`\n\n## Pull Request Process\n\n1. Fork the repository\n2. Create a feature branch: `git checkout -b feature/my-feature`\n3. Make changes following Hardshell standards\n4. Run tests: `PYTHONPATH=modules/exchange pytest tests/ -v`\n5. Run linting: `ruff check modules/ tests/`\n6. Submit a pull request\n\n### PR Checklist\n\n- [ ] Code follows Hardshell standards\n- [ ] All tests pass\n- [ ] New code has tests\n- [ ] Documentation updated (if needed)\n- [ ] No secrets in code\n- [ ] Conventional commit format used\n\n## Code of Conduct\n\nBe respectful, constructive, and inclusive.\n\n## Getting Help\n\n- Open an issue for bugs or feature requests\n- Check existing issues before creating new ones\n- Provide clear reproduction steps for bugs\n\n## License\n\nBy contributing, you agree that your contributions will be licensed under the MIT License.\n\nFile v0.15.8:SECURITY.md\n\n# Security Policy\n\n## Supported Versions\n\n| Version | Supported          |\n| ------- | ------------------ |\n| 0.14.x  | :white_check_mark: |\n| < 0.14  | :x:                |\n\n## Reporting a Vulnerability\n\n**Do not open a public issue.** Instead, email:\n\n📧 **security@firmade.ai**\n\nPGP key available at: https://firmade.ai/security/pgp-key.asc\n\n### What to expect\n\n| Step | Timeline |\n|------|----------|\n| Acknowledgment | Within 2 business days |\n| Initial assessment | Within 5 business days |\n| Fix preparation | Within 30 days |\n| Coordinated disclosure | Mutually agreed date (max 90 days) |\n\n### Scope\n\nNexLink is an OpenClaw skill that integrates Exchange, Nextcloud, and YouTube transcript extraction.\n\nIssues in scope include:\n- Missing or broken confirmation prompts on destructive operations\n- Credential leaks or unsafe handling of env vars / tokens\n- Path traversal in Nextcloud WebDAV operations\n- HTML injection in generated email digests\n- Unauthorized data access through Exchange EWS delegate escalation\n- LCM memory poisoning or cross-user context leakage\n\nOut of scope:\n- Issues in third-party services (Exchange server, Nextcloud instance, YouTube API)\n- Social engineering that requires physical access\n- Denial of service without data exposure\n\n## Security Design\n\nNexLink's security model, described in [references/security-best-practices.md](references/security-best-practices.md):\n- All destructive commands require explicit confirmation (interactive or per-command `--yes` flag)\n- `move_to_trash()` is used for task deletion instead of permanent `delete()`\n- Branding can be suppressed via `--no-branding` / `NEXLINK_NO_BRANDING=1`\n- Dedicated least-privilege service accounts strongly recommended\n\n## Acknowledgments\n\nWe appreciate responsible disclosure and will publicly thank researchers who follow this policy (unless they prefer anonymity).\n\nArchive v0.15.3: 49 files, 124540 bytes\n\nFiles: ABOUT.md (1963b), assets/config.template.yaml (1821b), BRAND.md (4565b), CHANGELOG.md (11397b), clawhub.json (1914b), config.template.yaml (521b), CONTRIBUTING.md (2106b), modules/exchange/__init__.py (94b), modules/exchange/__main__.py (267b), modules/exchange/analytics.py (17410b), modules/exchange/cal.py (21306b), modules/exchange/cli.py (4523b), modules/exchange/config.py (10183b), modules/exchange/connection.py (7414b), modules/exchange/contacts.py (12105b), modules/exchange/logger.py (9106b), modules/exchange/mail.py (22145b), modules/exchange/SKILL.md (6067b), modules/exchange/sync.py (15249b), modules/exchange/tasks.py (21430b), modules/exchange/utils.py (5103b), modules/nextcloud/contacts.py (23809b), modules/nextcloud/nextcloud.py (66997b), modules/nextcloud/SKILL.md (5301b), modules/youtube/__init__.py (57b), modules/youtube/__main__.py (99b), modules/youtube/youtube.py (10947b), push-commands.sh (824b), README.md (11599b), references/security-best-practices.md (3704b), references/setup.md (4206b), requirements.txt (333b), scripts/nexlink.py (12210b), scripts/validate.sh (2290b), SECURITY.md (1839b), setup.py (1297b), SKILL.md (10334b), tasks/state.json (965b), tasks/todo.md (962b), tests/integration/__init__.py (54b), tests/integration/test_sync.py (21491b), tests/test_all.py (12446b), tests/test_contacts.py (17445b), tests/test_exchange_contacts_live.py (13579b), tests/test_nextcloud_contacts_live.py (16744b), tests/test_nextcloud.py (21225b), tests/test_youtube.py (6106b), VERIFICATION.md (4896b), _meta.json (127b)\n\nFile v0.15.3:modules/exchange/SKILL.md\n\n---\nname: exchange\ndescription: Email, Calendar, and Tasks for Exchange on-premises (2016/2019). Use for reading/sending emails, managing calendar events, creating tasks, and syncing with Exchange server. Triggers on phrases like \"send email\", \"check calendar\", \"create task\", \"exchange mail\", \"outlook calendar\".\n---\n\n# Exchange Module\n\nEmail, Calendar, and Tasks operations for Microsoft Exchange Server on-premises (2016/2019) via EWS.\n\n## Requirements\n\n- Exchange Server 2016 or 2019 (on-premises)\n- EWS enabled on server\n- Account with mailbox permissions\n\n## Configuration\n\nSet environment variables:\n\n```bash\nexport EXCHANGE_SERVER=\"https://mail.example.com/EWS/Exchange.asmx\"\nexport EXCHANGE_USERNAME=\"your-username\"\nexport EXCHANGE_PASSWORD=\"your-password\"\nexport EXCHANGE_EMAIL=\"your-email@example.com\"\n```\n\nOr use a config file `config.yaml`:\n\n```yaml\nexchange:\n  server: https://mail.example.com/EWS/Exchange.asmx\n  username: ${EXCHANGE_USERNAME}\n  password: ${EXCHANGE_PASSWORD}\n  email: your-email@example.com\n  verify_ssl: false  # for self-signed certs\n```\n\n## Commands\n\n### Email (mail)\n\n```bash\n# Test connection\npython3 -m modules.exchange mail connect\n\n# List emails\npython3 -m modules.exchange mail read --limit 10\npython3 -m modules.exchange mail read --folder Inbox --unread\npython3 -m modules.exchange mail read --from \"boss@company.com\"\n\n# Send email\npython3 -m modules.exchange mail send --to \"user@example.com\" --subject \"Hello\" --body \"Message\"\n\n# Reply/Forward\npython3 -m modules.exchange mail reply --id EMAIL_ID --body \"Reply text\"\npython3 -m modules.exchange mail forward --id EMAIL_ID --to \"other@example.com\"\n\n# Attachments\npython3 -m modules.exchange mail list-attachments --id EMAIL_ID\npython3 -m modules.exchange mail download-attachment --id EMAIL_ID --name \"file.pdf\"\n```\n\n### Calendar (cal)\n\n```bash\n# List events\npython3 -m modules.exchange cal list --days 7\npython3 -m modules.exchange cal today\npython3 -m modules.exchange cal week\n\n# Create event\npython3 -m modules.exchange cal create --subject \"Meeting\" --start \"2024-01-15 14:00\" --duration 60\n\n# With attendees\npython3 -m modules.exchange cal create --subject \"Team Meeting\" --start \"2024-01-15 14:00\" --to \"user1@example.com,user2@example.com\"\n\n# Update/Delete\npython3 -m modules.exchange cal update --id EVENT_ID --location \"Room 101\"\npython3 -m modules.exchange cal delete --id EVENT_ID\n\n# Respond to meeting\npython3 -m modules.exchange cal respond --id EVENT_ID --response accept\n```\n\n### Tasks (tasks)\n\n```bash\n# List tasks (own mailbox)\npython3 -m modules.exchange tasks list\npython3 -m modules.exchange tasks list --overdue\npython3 -m modules.exchange tasks list --status in_progress\n\n# List tasks from another mailbox (delegate access)\npython3 -m modules.exchange tasks list --mailbox user@example.com\n\n# Create task (in your own mailbox)\npython3 -m modules.exchange tasks create --subject \"Review proposal\" --due \"+7d\" --priority high\n\n# Create task in another user's mailbox (requires delegate permissions)\npython3 -m modules.exchange tasks create --assign-to user@example.com --subject \"Review report\" --due \"2024-01-20\"\n\n# Get task details\npython3 -m modules.exchange tasks get --id TASK_ID\npython3 -m modules.exchange tasks get --id TASK_ID --mailbox user@example.com\n\n# Update task\npython3 -m modules.exchange tasks update --id TASK_ID --subject \"Updated subject\"\npython3 -m modules.exchange tasks update --id TASK_ID --status in_progress\n\n# Complete task\npython3 -m modules.exchange tasks complete --id TASK_ID\n\n# Move task to Deleted Items (trash)\npython3 -m modules.exchange tasks trash --id TASK_ID\npython3 -m modules.exchange tasks trash --mailbox user@example.com --id TASK_ID  # Requires delete permission\n```\n\n**Note on trash:** The `trash` command moves tasks to the Deleted Items folder. For delegate mailboxes, the service account has Editor permissions (can create/edit/complete tasks) but **cannot delete tasks**. This is intentional - tasks are preserved until you manually delete them from Outlook. When trash fails, the error message suggests completing the task or deleting manually from Outlook.\n\n### Error Handling\n\nAll task commands return informative error messages in Romanian with:\n\n- `error`: Clear error message\n- `cause`: Why it happened\n- `alternatives`: Available options\n\n**Example - Permission denied:**\n```json\n{\n  \"ok\": false,\n  \"error\": \"Task-urile pot fi șterse doar manual din Outlook.\",\n  \"cause\": \"Asistentul are permisiuni de Editor (poate crea/edita/completa), dar nu poate șterge task-urile. Aceasta e o limitare intenționată - task-urile se păstrează până le ștergi tu.\",\n  \"alternatives\": [\n    {\"action\": \"complete\", \"description\": \"Marchează task-ul ca finalizat (recomandat)\"},\n    {\"action\": \"manual_delete\", \"description\": \"Șterge manual din Outlook sau OWA\"}\n  ]\n}\n```\n\n**Example - Task not found:**\n```json\n{\n  \"ok\": false,\n  \"error\": \"Task-ul nu a fost găsit.\",\n  \"cause\": \"Task ID xxx nu există sau este invalid.\",\n  \"alternatives\": [\n    {\"action\": \"list\", \"description\": \"Listează task-urile disponibile\"}\n  ]\n}\n```\n\n### Sync (sync)\n\n```bash\n# Bidirectional sync with Exchange\npython3 -m modules.exchange sync sync\n\n# Show sync status\npython3 -m modules.exchange sync status\n\n# Send reminders for overdue/upcoming tasks\npython3 -m modules.exchange sync reminders --hours 24\n\n# Dry-run (show what would be sent)\npython3 -m modules.exchange sync reminders --hours 24 --dry-run\n\n# Create calendar event from task\npython3 -m modules.exchange sync link-calendar --id TASK_ID --time \"14:00\" --duration 60\n```\n\n## Notes\n\n- Tasks are created in your own Tasks folder by default\n- **Task Assignment**: Use `--assign-to user@example.com` to create tasks directly in another user's Exchange mailbox. This requires the service account to have delegate permissions on the target mailbox (configured on the Exchange server).\n- For collaborative tasks, use calendar events with attendees\n- For Exchange Online (Office 365), configuration may differ\n- Self-signed certificates require `verify_ssl: false`\n\nFile v0.15.3:modules/nextcloud/SKILL.md\n\n---\nname: nextcloud\ndescription: File management, document understanding, and workflow intelligence for Nextcloud via WebDAV and OCS APIs. Use for uploading, downloading, listing, searching, extracting text, summarizing files, Q&A over files, extracting workflow actions, creating Exchange tasks from files, sharing, moving, and copying files and folders on Nextcloud. Triggers on phrases like \"upload to nextcloud\", \"download from nextcloud\", \"list files on nextcloud\", \"search nextcloud\", \"summarize nextcloud file\", \"ask nextcloud file\", \"extract actions from file\", \"create tasks from file\", \"create nextcloud share link\", \"nextcloud file operations\".\n---\n\n# Nextcloud Module\n\nFile management on Nextcloud server using WebDAV protocol and OCS sharing APIs.\n\n## Requirements\n\n- Nextcloud instance with WebDAV enabled\n- App password (generate from Nextcloud security settings)\n\n## Configuration\n\nSet environment variables:\n\n```bash\nexport NEXTCLOUD_URL=\"https://cloud.example.com\"\nexport NEXTCLOUD_USERNAME=\"your-username\"\nexport NEXTCLOUD_APP_PASSWORD=\"your-app-password\"\n```\n\n## Commands\n\n### shared\nList folders shared with the current user.\n\n```bash\npython3 -m modules.nextcloud shared\n```\n\nReturns: Name, owner, permissions, and path for each shared folder.\n\n### list\nList files and folders in a directory.\n\n```bash\npython3 -m modules.nextcloud list /path/to/directory/\npython3 -m modules.nextcloud list /path/to/directory/ --recursive\n```\n\nReturns: File name, type (file/folder), size, and last modified date.\n\n### search\nSearch files and folders by name, recursively.\n\n```bash\npython3 -m modules.nextcloud search contract /Clients/\n```\n\nReturns: Matching files/folders with path, type, size, and last modified date.\n\n### extract-text\nExtract readable text from one supported file.\n\n```bash\npython3 -m modules.nextcloud extract-text /Clients/contract.docx\n```\n\n### summarize\nCreate a grounded summary for one file.\n\n```bash\npython3 -m modules.nextcloud summarize /Clients/contract.docx\n```\n\n### ask-file\nAnswer a question using one file as the source.\n\n```bash\npython3 -m modules.nextcloud ask-file /Clients/contract.docx \"When is the renewal due?\"\n```\n\n### extract-actions\nExtract grounded workflow actions from one file.\n\n```bash\npython3 -m modules.nextcloud extract-actions /Clients/contract.txt\n```\n\nReturns: action items, due-date hints, owner hints, and source excerpts.\n\n### create-tasks-from-file\nPreview or create Exchange tasks from extracted file actions.\n\n```bash\npython3 -m modules.nextcloud create-tasks-from-file /Clients/contract.txt\npython3 -m modules.nextcloud create-tasks-from-file /Clients/contract.txt --select 1,2 --execute\npython3 -m modules.nextcloud create-tasks-from-file /Clients/contract.txt --mailbox user@example.com --execute\n```\n\n### upload\nUpload a local file to Nextcloud.\n\n```bash\npython3 -m modules.nextcloud upload /local/file.txt /remote/directory/\n```\n\n### download\nDownload a file from Nextcloud to local filesystem.\n\n```bash\npython3 -m modules.nextcloud download /remote/file.txt /local/directory/\n```\n\n### mkdir\nCreate a new directory on Nextcloud.\n\n```bash\npython3 -m modules.nextcloud mkdir /new/folder/path/\n```\n\n### delete\nDelete a file or directory on Nextcloud.\n\n```bash\npython3 -m modules.nextcloud delete /path/to/delete\n```\n\n### move\nMove or rename a file or directory.\n\n```bash\npython3 -m modules.nextcloud move /old/path /new/path\n```\n\n### copy\nCopy a file or directory.\n\n```bash\npython3 -m modules.nextcloud copy /source/path /destination/path\n```\n\n### info\nGet detailed information about a file or directory.\n\n```bash\npython3 -m modules.nextcloud info /path/to/item\n```\n\n### s\n\nArchive v0.15.2: 49 files, 124430 bytes\n\nFiles: ABOUT.md (1963b), assets/config.template.yaml (1821b), BRAND.md (4565b), CHANGELOG.md (11397b), clawhub.json (1916b), config.template.yaml (521b), CONTRIBUTING.md (2106b), modules/exchange/__init__.py (94b), modules/exchange/__main__.py (267b), modules/exchange/analytics.py (17410b), modules/exchange/cal.py (21306b), modules/exchange/cli.py (4523b), modules/exchange/config.py (10183b), modules/exchange/connection.py (7414b), modules/exchange/contacts.py (12105b), modules/exchange/logger.py (9106b), modules/exchange/mail.py (22145b), modules/exchange/SKILL.md (6067b), modules/exchange/sync.py (15249b), modules/exchange/tasks.py (21430b), modules/exchange/utils.py (5103b), modules/nextcloud/contacts.py (23803b), modules/nextcloud/nextcloud.py (66991b), modules/nextcloud/SKILL.md (5301b), modules/youtube/__init__.py (57b), modules/youtube/__main__.py (99b), modules/youtube/youtube.py (10947b), push-commands.sh (824b), README.md (11599b), references/security-best-practices.md (3704b), references/setup.md (4206b), requirements.txt (267b), scripts/nexlink.py (12210b), scripts/validate.sh (2290b), SECURITY.md (1839b), setup.py (1297b), SKILL.md (10196b), tasks/state.json (965b), tasks/todo.md (962b), tests/integration/__init__.py (54b), tests/integration/test_sync.py (21491b), tests/test_all.py (12446b), tests/test_contacts.py (17445b), tests/test_exchange_contacts_live.py (13579b), tests/test_nextcloud_contacts_live.py (16744b), tests/test_nextcloud.py (21225b), tests/test_youtube.py (6106b), VERIFICATION.md (4896b), _meta.json (127b)\n\nArchive v0.15.1: 49 files, 124426 bytes\n\nFiles: ABOUT.md (1963b), assets/config.template.yaml (1821b), BRAND.md (4565b), CHANGELOG.md (11397b), clawhub.json (1916b), config.template.yaml (521b), CONTRIBUTING.md (2106b), modules/exchange/__init__.py (94b), modules/exchange/__main__.py (267b), modules/exchange/analytics.py (17410b), modules/exchange/cal.py (21306b), modules/exchange/cli.py (4523b), modules/exchange/config.py (10183b), modules/exchange/connection.py (7414b), modules/exchange/contacts.py (12105b), modules/exchange/logger.py (9106b), modules/exchange/mail.py (22145b), modules/exchange/SKILL.md (6067b), modules/exchange/sync.py (15249b), modules/exchange/tasks.py (21430b), modules/exchange/utils.py (5103b), modules/nextcloud/contacts.py (23803b), modules/nextcloud/nextcloud.py (66991b), modules/nextcloud/SKILL.md (5301b), modules/youtube/__init__.py (57b), modules/youtube/__main__.py (99b), modules/youtube/youtube.py (10947b), push-commands.sh (824b), README.md (11599b), references/security-best-practices.md (3710b), references/setup.md (4206b), requirements.txt (267b), scripts/nexlink.py (12210b), scripts/validate.sh (2290b), SECURITY.md (1839b), setup.py (1297b), SKILL.md (10196b), tasks/state.json (965b), tasks/todo.md (962b), tests/integration/__init__.py (54b), tests/integration/test_sync.py (21491b), tests/test_all.py (12446b), tests/test_contacts.py (17445b), tests/test_exchange_contacts_live.py (13579b), tests/test_nextcloud_contacts_live.py (16744b), tests/test_nextcloud.py (21225b), tests/test_youtube.py (6106b), VERIFICATION.md (4896b), _meta.json (127b)\n\nArchive v0.15.0: 49 files, 124424 bytes\n\nFiles: ABOUT.md (1963b), assets/config.template.yaml (1821b), BRAND.md (4565b), CHANGELOG.md (11397b), clawhub.json (1916b), config.template.yaml (521b), CONTRIBUTING.md (2106b), modules/exchange/__init__.py (94b), modules/exchange/__main__.py (267b), modules/exchange/analytics.py (17410b), modules/exchange/cal.py (21306b), modules/exchange/cli.py (4523b), modules/exchange/config.py (10183b), modules/exchange/connection.py (7414b), modules/exchange/contacts.py (12105b), modules/exchange/logger.py (9106b), modules/exchange/mail.py (22145b), modules/exchange/SKILL.md (6067b), modules/exchange/sync.py (15249b), modules/exchange/tasks.py (21430b), modules/exchange/utils.py (5103b), modules/nextcloud/contacts.py (23803b), modules/nextcloud/nextcloud.py (66991b), modules/nextcloud/SKILL.md (5301b), modules/youtube/__init__.py (57b), modules/youtube/__main__.py (99b), modules/youtube/youtube.py (10947b), push-commands.sh (824b), README.md (11599b), references/security-best-practices.md (3578b), references/setup.md (4206b), requirements.txt (267b), scripts/nexlink.py (12210b), scripts/validate.sh (2290b), SECURITY.md (1839b), setup.py (1297b), SKILL.md (10379b), tasks/state.json (965b), tasks/todo.md (962b), tests/integration/__init__.py (54b), tests/integration/test_sync.py (21491b), tests/test_all.py (12446b), tests/test_contacts.py (17445b), tests/test_exchange_contacts_live.py (13579b), tests/test_nextcloud_contacts_live.py (16744b), tests/test_nextcloud.py (21225b), tests/test_youtube.py (6106b), VERIFICATION.md (4896b), _meta.json (127b)\n\nArchive v0.14.2: 47 files, 117017 bytes\n\nFiles: ABOUT.md (1963b), assets/config.template.yaml (1821b), BRAND.md (4129b), CHANGELOG.md (9399b), clawhub.json (585b), config.template.yaml (521b), CONTRIBUTING.md (2106b), modules/exchange/__init__.py (94b), modules/exchange/__main__.py (267b), modules/exchange/analytics.py (17410b), modules/exchange/cal.py (21082b), modules/exchange/cli.py (4523b), modules/exchange/config.py (10183b), modules/exchange/connection.py (7414b), modules/exchange/contacts.py (12007b), modules/exchange/logger.py (9106b), modules/exchange/mail.py (21939b), modules/exchange/SKILL.md (6067b), modules/exchange/sync.py (15121b), modules/exchange/tasks.py (21249b), modules/exchange/utils.py (4161b), modules/nextcloud/contacts.py (22648b), modules/nextcloud/nextcloud.py (65522b), modules/nextcloud/SKILL.md (5301b), modules/youtube/__init__.py (57b), modules/youtube/__main__.py (99b), modules/youtube/youtube.py (10947b), push-commands.sh (824b), README.md (10329b), references/setup.md (4206b), requirements.txt (267b), scripts/nexlink.py (11107b), scripts/validate.sh (2290b), setup.py (1297b), SKILL.md (10147b), tasks/state.json (965b), tasks/todo.md (1542b), tests/integration/__init__.py (54b), tests/integration/test_sync.py (21491b), tests/test_all.py (9311b), tests/test_contacts.py (17445b), tests/test_exchange_contacts_live.py (13579b), tests/test_nextcloud_contacts_live.py (16744b), tests/test_nextcloud.py (21225b), tests/test_youtube.py (6106b), VERIFICATION.md (4896b), _meta.json (127b)\n\nArchive v0.14.1: 47 files, 117061 bytes\n\nFiles: ABOUT.md (1963b), assets/config.template.yaml (1821b), BRAND.md (4129b), CHANGELOG.md (9432b), clawhub.json (643b), config.template.yaml (521b), CONTRIBUTING.md (2106b), modules/exchange/__init__.py (94b), modules/exchange/__main__.py (267b), modules/exchange/analytics.py (17410b), modules/exchange/cal.py (21082b), modules/exchange/cli.py (4523b), modules/exchange/config.py (10183b), modules/exchange/connection.py (7414b), modules/exchange/contacts.py (12007b), modules/exchange/logger.py (9106b), modules/exchange/mail.py (21939b), modules/exchange/SKILL.md (6067b), modules/exchange/sync.py (15121b), modules/exchange/tasks.py (21249b), modules/exchange/utils.py (4161b), modules/nextcloud/contacts.py (22648b), modules/nextcloud/nextcloud.py (65522b), modules/nextcloud/SKILL.md (5301b), modules/youtube/__init__.py (57b), modules/youtube/__main__.py (99b), modules/youtube/youtube.py (10947b), push-commands.sh (824b), README.md (10298b), references/setup.md (4206b), requirements.txt (267b), scripts/nexlink.py (11107b), scripts/validate.sh (2290b), setup.py (1297b), SKILL.md (10147b), tasks/state.json (965b), tasks/todo.md (1542b), tests/integration/__init__.py (54b), tests/integration/test_sync.py (21491b), tests/test_all.py (9311b), tests/test_contacts.py (17445b), tests/test_exchange_contacts_live.py (13579b), tests/test_nextcloud_contacts_live.py (16744b), tests/test_nextcloud.py (21225b), tests/test_youtube.py (6106b), VERIFICATION.md (4896b), _meta.json (127b)\n\nArchive v0.14.0: 47 files, 116944 bytes\n\nFiles: ABOUT.md (1963b), assets/config.template.yaml (1821b), BRAND.md (4129b), CHANGELOG.md (9432b), clawhub.json (643b), config.template.yaml (521b), CONTRIBUTING.md (2106b), modules/exchange/__init__.py (94b), modules/exchange/__main__.py (267b), modules/exchange/analytics.py (17410b), modules/exchange/cal.py (21082b), modules/exchange/cli.py (4523b), modules/exchange/config.py (10183b), modules/exchange/connection.py (7414b), modules/exchange/contacts.py (12007b), modules/exchange/logger.py (9106b), modules/exchange/mail.py (21939b), modules/exchange/SKILL.md (6067b), modules/exchange/sync.py (15121b), modules/exchange/tasks.py (21249b), modules/exchange/utils.py (4161b), modules/nextcloud/contacts.py (22648b), modules/nextcloud/nextcloud.py (65522b), modules/nextcloud/SKILL.md (5301b), modules/youtube/__init__.py (57b), modules/youtube/__main__.py (99b), modules/youtube/youtube.py (10947b), push-commands.sh (824b), README.md (10054b), references/setup.md (4206b), requirements.txt (267b), scripts/nexlink.py (11107b), scripts/validate.sh (2290b), setup.py (1297b), SKILL.md (9955b), tasks/state.json (965b), tasks/todo.md (1542b), tests/integration/__init__.py (54b), tests/integration/test_sync.py (21491b), tests/test_all.py (9311b), tests/test_contacts.py (17445b), tests/test_exchange_contacts_live.py (13579b), tests/test_nextcloud_contacts_live.py (16744b), tests/test_nextcloud.py (21225b), tests/test_youtube.py (6106b), VERIFICATION.md (4896b), _meta.json (127b)\n\nArchive v0.13.4: 43 files, 110636 bytes\n\nFiles: ABOUT.md (1963b), assets/config.template.yaml (1821b), BRAND.md (4129b), CHANGELOG.md (8798b), clawhub.json (643b), config.template.yaml (521b), CONTRIBUTING.md (2106b), modules/exchange/__init__.py (94b), modules/exchange/__main__.py (267b), modules/exchange/analytics.py (17410b), modules/exchange/cal.py (21082b), modules/exchange/cli.py (4523b), modules/exchange/config.py (10183b), modules/exchange/connection.py (7414b), modules/exchange/contacts.py (12007b), modules/exchange/logger.py (9106b), modules/exchange/mail.py (21939b), modules/exchange/SKILL.md (6067b), modules/exchange/sync.py (15121b), modules/exchange/tasks.py (21249b), modules/exchange/utils.py (4161b), modules/nextcloud/contacts.py (22648b), modules/nextcloud/nextcloud.py (65522b), modules/nextcloud/SKILL.md (5301b), push-commands.sh (824b), README.md (9477b), references/setup.md (4206b), requirements.txt (267b), scripts/nexlink.py (10487b), scripts/validate.sh (2290b), setup.py (1297b), SKILL.md (9060b), tasks/state.json (965b), tasks/todo.md (1542b), tests/integration/__init__.py (54b), tests/integration/test_sync.py (21491b), tests/...","readmeExcerpt":"Skill: Nexlink Owner: asistent-alex Summary: 🔗 NexLink — Enterprise Connector for Nextcloud, Exchange & YouTube. Built by Firma de AI. Email, calendar, tasks, file management, document understanding, t... Tags: latest:0.15.9 Version history: v0.15.9 | 2026-05-01T19:22:45.265Z | user v0.15.9 v0.15.8 | 2026-05-01T14:25:02.057Z | user Security: per-command --yes only, pinned dependencies, file permissions (0o600/0o700)","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"export EXCHANGE_SERVER=\"https://mail.example.com/EWS/Exchange.asmx\"\nexport EXCHANGE_USERNAME=\"your-username\"\nexport EXCHANGE_PASSWORD=\"your-password\"\nexport EXCHANGE_EMAIL=\"your-email@example.com\""},{"language":"yaml","snippet":"exchange:\n  server: https://mail.example.com/EWS/Exchange.asmx\n  username: ${EXCHANGE_USERNAME}\n  password: ${EXCHANGE_PASSWORD}\n  email: your-email@example.com\n  verify_ssl: false  # for self-signed certs"},{"language":"bash","snippet":"# Test connection\npython3 -m modules.exchange mail connect\n\n# List emails\npython3 -m modules.exchange mail read --limit 10\npython3 -m modules.exchange mail read --folder Inbox --unread\npython3 -m modules.exchange mail read --from \"boss@company.com\"\n\n# Send email\npython3 -m modules.exchange mail send --to \"user@example.com\" --subject \"Hello\" --body \"Message\"\n\n# Reply/Forward\npython3 -m modules.exchange mail reply --id EMAIL_ID --body \"Reply text\"\npython3 -m modules.exchange mail forward --id EMAIL_ID --to \"other@example.com\"\n\n# Attachments\npython3 -m modules.exchange mail list-attachments --id EMAIL_ID\npython3 -m modules.exchange mail download-attachment --id EMAIL_ID --name \"file.pdf\""},{"language":"bash","snippet":"# List events\npython3 -m modules.exchange cal list --days 7\npython3 -m modules.exchange cal today\npython3 -m modules.exchange cal week\n\n# Create event\npython3 -m modules.exchange cal create --subject \"Meeting\" --start \"2024-01-15 14:00\" --duration 60\n\n# With attendees\npython3 -m modules.exchange cal create --subject \"Team Meeting\" --start \"2024-01-15 14:00\" --to \"user1@example.com,user2@example.com\"\n\n# Update/Delete\npython3 -m modules.exchange cal update --id EVENT_ID --location \"Room 101\"\npython3 -m modules.exchange cal delete --id EVENT_ID\n\n# Respond to meeting\npython3 -m modules.exchange cal respond --id EVENT_ID --response accept"},{"language":"bash","snippet":"# List tasks (own mailbox)\npython3 -m modules.exchange tasks list\npython3 -m modules.exchange tasks list --overdue\npython3 -m modules.exchange tasks list --status in_progress\n\n# List tasks from another mailbox (delegate access)\npython3 -m modules.exchange tasks list --mailbox user@example.com\n\n# Create task (in your own mailbox)\npython3 -m modules.exchange tasks create --subject \"Review proposal\" --due \"+7d\" --priority high\n\n# Create task in another user's mailbox (requires delegate permissions)\npython3 -m modules.exchange tasks create --assign-to user@example.com --subject \"Review report\" --due \"2024-01-20\"\n\n# Get task details\npython3 -m modules.exchange tasks get --id TASK_ID\npython3 -m modules.exchange tasks get --id TASK_ID --mailbox user@example.com\n\n# Update task\npython3 -m modules.exchange tasks update --id TASK_ID --subject \"Updated subject\"\npython3 -m modules.exchange tasks update --id TASK_ID --status in_progress\n\n# Complete task\npython3 -m modules.exchange tasks complete --id TASK_ID\n\n# Move task to Deleted Items (trash)\npython3 -m modules.exchange tasks trash --id TASK_ID\npython3 -m modules.exchange tasks trash --mailbox user@example.com --id TASK_ID  # Requires delete permission"},{"language":"json","snippet":"{\n  \"ok\": false,\n  \"error\": \"Task-urile pot fi șterse doar manual din Outlook.\",\n  \"cause\": \"Asistentul are permisiuni de Editor (poate crea/edita/completa), dar nu poate șterge task-urile. Aceasta e o limitare intenționată - task-urile se păstrează până le ștergi tu.\",\n  \"alternatives\": [\n    {\"action\": \"complete\", \"description\": \"Marchează task-ul ca finalizat (recomandat)\"},\n    {\"action\": \"manual_delete\", \"description\": \"Șterge manual din Outlook sau OWA\"}\n  ]\n}"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"modules/exchange/SKILL.md","content":"---\nname: exchange\ndescription: Email, Calendar, and Tasks for Exchange on-premises (2016/2019). Use for reading/sending emails, managing calendar events, creating tasks, and syncing with Exchange server. Triggers on phrases like \"send email\", \"check calendar\", \"create task\", \"exchange mail\", \"outlook calendar\".\n---\n\n# Exchange Module\n\nEmail, Calendar, and Tasks operations for Microsoft Exchange Server on-premises (2016/2019) via EWS.\n\n## Requirements\n\n- Exchange Server 2016 or 2019 (on-premises)\n- EWS enabled on server\n- Account with mailbox permissions\n\n## Configuration\n\nSet environment variables:\n\n```bash\nexport EXCHANGE_SERVER=\"https://mail.example.com/EWS/Exchange.asmx\"\nexport EXCHANGE_USERNAME=\"your-username\"\nexport EXCHANGE_PASSWORD=\"your-password\"\nexport EXCHANGE_EMAIL=\"your-email@example.com\"\n```\n\nOr use a config file `config.yaml`:\n\n```yaml\nexchange:\n  server: https://mail.example.com/EWS/Exchange.asmx\n  username: ${EXCHANGE_USERNAME}\n  password: ${EXCHANGE_PASSWORD}\n  email: your-email@example.com\n  verify_ssl: false  # for self-signed certs\n```\n\n## Commands\n\n### Email (mail)\n\n```bash\n# Test connection\npython3 -m modules.exchange mail connect\n\n# List emails\npython3 -m modules.exchange mail read --limit 10\npython3 -m modules.exchange mail read --folder Inbox --unread\npython3 -m modules.exchange mail read --from \"boss@company.com\"\n\n# Send email\npython3 -m modules.exchange mail send --to \"user@example.com\" --subject \"Hello\" --body \"Message\"\n\n# Reply/Forward\npython3 -m modules.exchange mail reply --id EMAIL_ID --body \"Reply text\"\npython3 -m modules.exchange mail forward --id EMAIL_ID --to \"other@example.com\"\n\n# Attachments\npython3 -m modules.exchange mail list-attachments --id EMAIL_ID\npython3 -m modules.exchange mail download-attachment --id EMAIL_ID --name \"file.pdf\"\n```\n\n### Calendar (cal)\n\n```bash\n# List events\npython3 -m modules.exchange cal list --days 7\npython3 -m modules.exchange cal today\npython3 -m modules.exchange cal week\n\n# Create event\npython3 -m modules.exchange cal create --subject \"Meeting\" --start \"2024-01-15 14:00\" --duration 60\n\n# With attendees\npython3 -m modules.exchange cal create --subject \"Team Meeting\" --start \"2024-01-15 14:00\" --to \"user1@example.com,user2@example.com\"\n\n# Update/Delete\npython3 -m modules.exchange cal update --id EVENT_ID --location \"Room 101\"\npython3 -m modules.exchange cal delete --id EVENT_ID\n\n# Respond to meeting\npython3 -m modules.exchange cal respond --id EVENT_ID --response accept\n```\n\n### Tasks (tasks)\n\n```bash\n# List tasks (own mailbox)\npython3 -m modules.exchange tasks list\npython3 -m modules.exchange tasks list --overdue\npython3 -m modules.exchange tasks list --status in_progress\n\n# List tasks from another mailbox (delegate access)\npython3 -m modules.exchange tasks list --mailbox user@example.com\n\n# Create task (in your own mailbox)\npython3 -m modules.exchange tasks create --subject \"Review proposal\" --due \"+7d\" --priority high\n\n# Create task in another user's mailbox (requires delegat"},{"path":"modules/nextcloud/SKILL.md","content":"---\nname: nextcloud\ndescription: File management, document understanding, and workflow intelligence for Nextcloud via WebDAV and OCS APIs. Use for uploading, downloading, listing, searching, extracting text, summarizing files, Q&A over files, extracting workflow actions, creating Exchange tasks from files, sharing, moving, and copying files and folders on Nextcloud. Triggers on phrases like \"upload to nextcloud\", \"download from nextcloud\", \"list files on nextcloud\", \"search nextcloud\", \"summarize nextcloud file\", \"ask nextcloud file\", \"extract actions from file\", \"create tasks from file\", \"create nextcloud share link\", \"nextcloud file operations\".\n---\n\n# Nextcloud Module\n\nFile management on Nextcloud server using WebDAV protocol and OCS sharing APIs.\n\n## Requirements\n\n- Nextcloud instance with WebDAV enabled\n- App password (generate from Nextcloud security settings)\n\n## Configuration\n\nSet environment variables:\n\n```bash\nexport NEXTCLOUD_URL=\"https://cloud.example.com\"\nexport NEXTCLOUD_USERNAME=\"your-username\"\nexport NEXTCLOUD_APP_PASSWORD=\"your-app-password\"\n```\n\n## Commands\n\n### shared\nList folders shared with the current user.\n\n```bash\npython3 -m modules.nextcloud shared\n```\n\nReturns: Name, owner, permissions, and path for each shared folder.\n\n### list\nList files and folders in a directory.\n\n```bash\npython3 -m modules.nextcloud list /path/to/directory/\npython3 -m modules.nextcloud list /path/to/directory/ --recursive\n```\n\nReturns: File name, type (file/folder), size, and last modified date.\n\n### search\nSearch files and folders by name, recursively.\n\n```bash\npython3 -m modules.nextcloud search contract /Clients/\n```\n\nReturns: Matching files/folders with path, type, size, and last modified date.\n\n### extract-text\nExtract readable text from one supported file.\n\n```bash\npython3 -m modules.nextcloud extract-text /Clients/contract.docx\n```\n\n### summarize\nCreate a grounded summary for one file.\n\n```bash\npython3 -m modules.nextcloud summarize /Clients/contract.docx\n```\n\n### ask-file\nAnswer a question using one file as the source.\n\n```bash\npython3 -m modules.nextcloud ask-file /Clients/contract.docx \"When is the renewal due?\"\n```\n\n### extract-actions\nExtract grounded workflow actions from one file.\n\n```bash\npython3 -m modules.nextcloud extract-actions /Clients/contract.txt\n```\n\nReturns: action items, due-date hints, owner hints, and source excerpts.\n\n### create-tasks-from-file\nPreview or create Exchange tasks from extracted file actions.\n\n```bash\npython3 -m modules.nextcloud create-tasks-from-file /Clients/contract.txt\npython3 -m modules.nextcloud create-tasks-from-file /Clients/contract.txt --select 1,2 --execute\npython3 -m modules.nextcloud create-tasks-from-file /Clients/contract.txt --mailbox user@example.com --execute\n```\n\n### upload\nUpload a local file to Nextcloud.\n\n```bash\npython3 -m modules.nextcloud upload /local/file.txt /remote/directory/\n```\n\n### download\nDownload a file from Nextcloud to local filesystem.\n\n```bash\npython3 -m modules.nextcl"},{"path":"SKILL.md","content":"---\nname: nexlink\nversion: 0.15.9\ndescription: \"🔗 NexLink — Enterprise Connector for Nextcloud, Exchange & YouTube. Built by Firma de AI. Email, calendar, tasks, file management, document understanding, transcript extraction, contacts, analytics — with built-in security confirmations and least-privilege defaults.\"\nmetadata:\n  openclaw:\n    requires:\n      bins:\n        - python3\n        - pip3\n      env:\n        - EXCHANGE_SERVER\n        - EXCHANGE_USERNAME\n        - EXCHANGE_PASSWORD\n        - EXCHANGE_EMAIL\n        - OWNER_EMAIL  # Optional: recipient for notifications (defaults to EXCHANGE_EMAIL)\n        - NEXTCLOUD_URL\n        - NEXTCLOUD_USERNAME\n        - NEXTCLOUD_APP_PASSWORD\n        - NEXLINK_BRANDING  # Optional: set to 1 to enable vendor branding in outputs\n    dependencies:\n      - name: exchangelib\n        type: pip\n        version: \"==5.6.0\"\n      - name: requests-ntlm\n        type: pip\n        version: \"==1.3.0\"\n      - name: defusedxml\n        type: pip\n        version: \"==0.7.1\"\n        description: \"Secure XML parsing — fixes XXE vulnerability\"\n      - name: requests\n        type: pip\n        version: \"==2.31.0\"\n      - name: lxml\n        type: pip\n        version: \"==6.0.2\"\n      - name: pdfplumber\n        type: pip\n        version: \">=0.10.0\"\n        optional: true\n      - name: youtube-transcript-api\n        type: pip\n        version: \">=1.0.0\"\n        description: \"Document understanding features\"\n      - name: pytest\n        type: pip\n        version: \">=7.0.0\"\n        optional: true\n        description: \"Testing framework\"\n    primaryEnv: EXCHANGE_SERVER\n    skillKey: \"nextlink\"\n    emoji: \"🔗\"\n    homepage: https://github.com/asistent-alex/openclaw-nexlink\n    always: false\n    author: Firma de AI\n    links:\n      homepage: https://firmade.ai\n      repository: https://github.com/asistent-alex/openclaw-nexlink\n---\n\n# NexLink — Nextcloud, Exchange & YouTube Connector\n\n**Built by [Firma de AI](https://firmade.ai), supported by [Firma de IT](https://firmade.it).**\n\nThis skill connects Nextcloud, Exchange, and YouTube into one practical workflow layer for:\n\n- **Nextcloud**: file operations, sharing, document understanding, workflow extraction\n- **Exchange**: email, calendar, tasks, analytics\n- **YouTube**: transcript extraction with language fallback\n\n## Available Modules\n\n| Module | Description | Command |\n|--------|-------------|---------|\n| **Nextcloud** | Files, sharing, summarization, Q&A, action extraction, Contacts (CardDAV) | `nexlink files <...> \\| nexlink contacts --source nextcloud <...>` |\n| **Exchange** | Email, Calendar, Tasks, Analytics, Contacts | `nexlink <mail\\|cal\\|tasks\\|analytics\\|sync\\|contacts>` |\n| **YouTube** | Transcript extraction with language fallback | `nexlink youtube transcript\\|languages <url>` |\n\n## What it solves\n\nUse this skill when you want to work with:\n\n- Nextcloud files: listing, search, upload, download, move, sharing\n- document understanding: extract-text, summarize, ask-file\n- workfl"},{"path":"README.md","content":"<div align=\"center\">\n\n# 🔗 NexLink — Enterprise Connector for Nextcloud, Exchange & YouTube\n\n**Email, calendar, tasks, file management, document understanding, transcript extraction, contacts, and analytics**\n\n**Built by [Firma de AI](https://firmade.ai) · Supported by [Firma de IT](https://firmade.it)**\n\n[![Version](https://img.shields.io/badge/version-0.15.2-blue.svg)](https://github.com/asistent-alex/openclaw-nexlink)\n[![License: MIT-0](https://img.shields.io/badge/License-MIT--0-yellow.svg)](https://opensource.org/licenses/MIT)\n[![OpenClaw Skill](https://img.shields.io/badge/OpenClaw-Skill-green.svg)](https://clawhub.ai/asistent-alex/nexlink)\n[![Python 3.10+](https://img.shields.io/badge/python-3.10%2B-brightgreen.svg)](https://www.python.org/)\n[![Tests](https://img.shields.io/badge/tests-48%2F48%20passed-brightgreen.svg)](https://github.com/asistent-alex/openclaw-nexlink/actions)\n[![ClawHub](https://img.shields.io/badge/clawhub-nexlink-8A2BE2.svg)](https://clawhub.ai/asistent-alex/nexlink)\n[![Hardshell](https://img.shields.io/badge/code%20style-Hardshell-ff69b4.svg)](https://github.com/asistent-alex/openclaw-hardshell)\n[![GitHub](https://img.shields.io/badge/GitHub-Repo-181717.svg?logo=github)](https://github.com/asistent-alex/openclaw-nexlink)\n[![Security](https://img.shields.io/badge/security-audited-brightgreen.svg)](https://github.com/asistent-alex/openclaw-nexlink/blob/main/SECURITY.md)\n\n</div>\n\n---\n\n**NexLink** connects Nextcloud, Microsoft Exchange, and YouTube into one enterprise-grade workflow layer — with built-in security confirmations and least-privilege defaults.\n\n> **Public positioning:** *Firma de AI — Nextcloud, Exchange & YouTube Assistant*  \n> **CLI name:** `nexlink` · **Version:** `v0.15.2` · **License:** `MIT-0`\n\n### 🔗 Official Links\n\n| Resource | URL |\n|----------|-----|\n| 🏠 **Homepage** | [firmade.ai](https://firmade.ai) |\n| 📦 **GitHub Repository** | [github.com/asistent-alex/openclaw-nexlink](https://github.com/asistent-alex/openclaw-nexlink) |\n| 📋 **ClawHub Listing** | [clawhub.ai/asistent-alex/nexlink](https://clawhub.ai/asistent-alex/nexlink) |\n| 📖 **Documentation** | [github.com/asistent-alex/openclaw-nexlink#readme](https://github.com/asistent-alex/openclaw-nexlink#readme) |\n| 🔒 **Security Policy** | [github.com/asistent-alex/openclaw-nexlink/blob/main/SECURITY.md](https://github.com/asistent-alex/openclaw-nexlink/blob/main/SECURITY.md) |\n| 📝 **Changelog** | [github.com/asistent-alex/openclaw-nexlink/blob/main/CHANGELOG.md](https://github.com/asistent-alex/openclaw-nexlink/blob/main/CHANGELOG.md) |\n| 🐛 **Issues** | [github.com/asistent-alex/openclaw-nexlink/issues](https://github.com/asistent-alex/openclaw-nexlink/issues) |\n| 🔄 **Releases** | [github.com/asistent-alex/openclaw-nexlink/releases](https://github.com/asistent-alex/openclaw-nexlink/releases) |\n\n---\n\n## What it does\n\nThis skill connects Nextcloud, Exchange, and YouTube into one practical workflow layer for:\n\n- **Files** — list, search, upload, "},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn79j1bsq3gg7dhe829cx763g983x4dy\",\n  \"slug\": \"nexlink\",\n  \"version\": \"0.15.9\",\n  \"publishedAt\": 1777663365265\n}"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"🔗 NexLink — Enterprise Connector for Nextcloud, Exchange & YouTube. Built by Firma de AI. Email, calendar, tasks, file management, document understanding, t... Skill: Nexlink Owner: asistent-alex Summary: 🔗 NexLink — Enterprise Connector for Nextcloud, Exchange & YouTube. Built by Firma de AI. Email, calendar, tasks, file management, document understanding, t... Tags: latest:0.15.9 Version history: v0.15.9 | 2026-05-01T19:22:45.265Z | user v0.15.9 v0.15.8 | 2026-05-01T14:25:02.057Z | user Security: per-command --yes only, pinned dependencies, file permissions (0o600/0o700)","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1190,"uniquenessScore":45,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-10T08:19:32.799Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-10T08:19:32.799Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-10T10:42:51.608Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}