[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6K1V8FN583VX50AB2HSN71F":3,"skill-same:01M6K1V8FN583VX50AB2HSN71F":72},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":37,"linkOnly":38,"markdownContent":39,"markdownBody":40,"frontMatter":41,"refName":42,"commitSha":43,"skillDirectory":44,"forksCount":45,"repositoryHtmlUrl":46,"repositoryHomepageUrl":47,"ownerHtmlUrl":48,"ownerBlogUrl":49,"ownerDescription":50,"updatedAt":51,"install":52,"resources":65},"01M6K1V8FN583VX50AB2HSN71F","host-open-helper",null,"Host service that opens local files and directories and searches by name through Spotlight for Gnosi runtimes that cannot access those operating-system capabilities directly.","ismigar\u002FGnosi","ismigar","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F6537880?v=4","01M6K1KJFJXCT6S4ATNXFRD1Y7","Ismael García","01M6K1KJM0CK16BDEYVZCV6949",2,"AGPL-3.0","https:\u002F\u002Fgithub.com\u002Fismigar\u002FGnosi\u002Fblob\u002Fmain\u002Fpipeline\u002Fskills\u002Fhost_open_helper\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36],"open","host open helper","host","helper","by name","capabilities","local files","for","directories","runtimes","spotlight","operating","name","service","local","files","system","access","2026-11-10 10:12:30",false,"---\nname: host-open-helper\ndescription: Host service that opens local files and directories and searches by name through Spotlight for Gnosi runtimes that cannot access those operating-system capabilities directly.\n---\n\n# Host Open Helper\n\n## Purpose\n\nThis small HTTP service listens on `127.0.0.1:5099` and opens local paths with\n`open` on macOS, `xdg-open` on Linux, or `os.startfile` on Windows. Gnosi uses\nit when a user selects a `file:\u002F\u002F` link in the editor.\n\nIt also exposes `\u002Fsearch`, a filename search backed by Spotlight `mdfind` on\nmacOS. This avoids slow recursive `os.walk` scans over cloud-synchronized folders.\n\nNative Gnosi connects to `127.0.0.1:5099`. Docker deployments use\n`host.docker.internal:5099`. The backend selects the correct default through\n`default_host_helper_url()` and `_is_docker()`; never hard-code one mode.\n\n## Endpoints\n\n- `GET \u002Fhealthz`: liveness check.\n- `POST \u002Fopen`: accepts `{\"path\": \"\u002FUsers\u002F...\u002FKitchen\"}` or a `file:\u002F\u002F\u002F...`\n  URI. Returns `200` when opened, `403` outside `GNOSI_OPEN_ROOTS`, and `404`\n  when the target does not exist.\n- `POST \u002Fsearch`: accepts\n  `{\"query\": \"...\", \"limit\": 100, \"roots\": [\"\u002FUsers\u002F...\u002FVault\", ...]}`.\n  It runs `mdfind -onlyin \u003Croot> -name \u003Cquery>`. `roots` is optional and\n  defaults to `$HOME`; nested roots are collapsed. The response is\n  `{\"results\": [{\"name\",\"path\",\"is_dir\"}], \"truncated\": bool}`.\n  Queries shorter than two characters return `400`. A complete Spotlight\n  failure returns `500`, allowing the backend to fall back to `os.walk`.\n\n## Security\n\n- Bind only to `127.0.0.1`.\n- Restrict paths with colon-separated `GNOSI_OPEN_ROOTS`. When empty, allow\n  paths only under `$HOME`.\n- Apply the same allowlist to `\u002Fsearch` roots and filter noisy hidden\n  directories such as `.git`, `node_modules`, and `.history`.\n- Pass the query as a separate argv value and never through a shell.\n- Run subprocesses without `shell=True`.\n\n## Provisioning boundary\n\nThe public repository ships only the portable helper implementation. It does\nnot install, start, stop or rewrite operating-system services. Maintainer\nLaunchAgent templates and idempotent machine provisioning belong exclusively to\nthe private `WorkspaceTools\u002Fskills\u002Fhost_open_helper` skill.\n\nSelf-hosters may run `host_open_helper.py` directly or create their own service\ndefinition after reviewing every executable path and `GNOSI_OPEN_ROOTS`. Never\ncopy a service definition from another machine: absolute paths and privacy\npermissions are user- and host-specific.\n\n## Restrictions and edge cases\n\n- A Docker container cannot invoke the macOS Finder or Explorer directly. Its\n  Linux environment lacks the host `open` executable and GUI session. Use the\n  helper through the auto-detected host URL.\n- Port `5099` is fixed for predictability. To change it, update\n  `GNOSI_HOST_OPEN_PORT` in the plist and the backend URL configuration.\n- OneDrive can raise `Errno 35` resource deadlocks on macOS. That affects\n  Gnosi indexing, not the helper's open operation.\n- `\u002Fsearch` depends on the Spotlight index. It returns an empty result rather\n  than an error for volumes excluded from indexing. If `mdfind` fails, the\n  helper returns `500` and the backend falls back to `os.walk`.\n- `mdfind` diagnostic lines such as `[UserQueryParser] Loading keywords…`\n  appear on stderr and do not contaminate stdout results.\n\n### Empty `\u002Fsearch` results under a background service\n\nSymptom: `\u002Fsearch` immediately returns `200` and no results, while the same\n`mdfind -onlyin $HOME -name \u003Cquery>` command works in Terminal. Files under\n`~\u002FDownloads` or `~\u002FLibrary\u002FCloudStorage` are commonly affected.\n\nCause: a background service does not necessarily inherit Terminal's\nFull Disk Access. macOS TCC grants access by binary and responsible process,\nso `mdfind` can return filtered results without an error. The same pattern\naffects the OneDrive warmup daemon.\n\nFix on macOS: add the service's Python binary to **System Settings > Privacy &\nSecurity > Full Disk Access**. Locate the configured binary in the private\nservice definition or process manager.\n\nThen restart it through the owning private provisioning tool so TCC reevaluates\naccess. As a temporary diagnostic alternative, stop the background service and run\n`host_open_helper.py` manually from a Terminal process that already has Full\nDisk Access.\n","# Host Open Helper\n\n## Purpose\n\nThis small HTTP service listens on `127.0.0.1:5099` and opens local paths with\n`open` on macOS, `xdg-open` on Linux, or `os.startfile` on Windows. Gnosi uses\nit when a user selects a `file:\u002F\u002F` link in the editor.\n\nIt also exposes `\u002Fsearch`, a filename search backed by Spotlight `mdfind` on\nmacOS. This avoids slow recursive `os.walk` scans over cloud-synchronized folders.\n\nNative Gnosi connects to `127.0.0.1:5099`. Docker deployments use\n`host.docker.internal:5099`. The backend selects the correct default through\n`default_host_helper_url()` and `_is_docker()`; never hard-code one mode.\n\n## Endpoints\n\n- `GET \u002Fhealthz`: liveness check.\n- `POST \u002Fopen`: accepts `{\"path\": \"\u002FUsers\u002F...\u002FKitchen\"}` or a `file:\u002F\u002F\u002F...`\n  URI. Returns `200` when opened, `403` outside `GNOSI_OPEN_ROOTS`, and `404`\n  when the target does not exist.\n- `POST \u002Fsearch`: accepts\n  `{\"query\": \"...\", \"limit\": 100, \"roots\": [\"\u002FUsers\u002F...\u002FVault\", ...]}`.\n  It runs `mdfind -onlyin \u003Croot> -name \u003Cquery>`. `roots` is optional and\n  defaults to `$HOME`; nested roots are collapsed. The response is\n  `{\"results\": [{\"name\",\"path\",\"is_dir\"}], \"truncated\": bool}`.\n  Queries shorter than two characters return `400`. A complete Spotlight\n  failure returns `500`, allowing the backend to fall back to `os.walk`.\n\n## Security\n\n- Bind only to `127.0.0.1`.\n- Restrict paths with colon-separated `GNOSI_OPEN_ROOTS`. When empty, allow\n  paths only under `$HOME`.\n- Apply the same allowlist to `\u002Fsearch` roots and filter noisy hidden\n  directories such as `.git`, `node_modules`, and `.history`.\n- Pass the query as a separate argv value and never through a shell.\n- Run subprocesses without `shell=True`.\n\n## Provisioning boundary\n\nThe public repository ships only the portable helper implementation. It does\nnot install, start, stop or rewrite operating-system services. Maintainer\nLaunchAgent templates and idempotent machine provisioning belong exclusively to\nthe private `WorkspaceTools\u002Fskills\u002Fhost_open_helper` skill.\n\nSelf-hosters may run `host_open_helper.py` directly or create their own service\ndefinition after reviewing every executable path and `GNOSI_OPEN_ROOTS`. Never\ncopy a service definition from another machine: absolute paths and privacy\npermissions are user- and host-specific.\n\n## Restrictions and edge cases\n\n- A Docker container cannot invoke the macOS Finder or Explorer directly. Its\n  Linux environment lacks the host `open` executable and GUI session. Use the\n  helper through the auto-detected host URL.\n- Port `5099` is fixed for predictability. To change it, update\n  `GNOSI_HOST_OPEN_PORT` in the plist and the backend URL configuration.\n- OneDrive can raise `Errno 35` resource deadlocks on macOS. That affects\n  Gnosi indexing, not the helper's open operation.\n- `\u002Fsearch` depends on the Spotlight index. It returns an empty result rather\n  than an error for volumes excluded from indexing. If `mdfind` fails, the\n  helper returns `500` and the backend falls back to `os.walk`.\n- `mdfind` diagnostic lines such as `[UserQueryParser] Loading keywords…`\n  appear on stderr and do not contaminate stdout results.\n\n### Empty `\u002Fsearch` results under a background service\n\nSymptom: `\u002Fsearch` immediately returns `200` and no results, while the same\n`mdfind -onlyin $HOME -name \u003Cquery>` command works in Terminal. Files under\n`~\u002FDownloads` or `~\u002FLibrary\u002FCloudStorage` are commonly affected.\n\nCause: a background service does not necessarily inherit Terminal's\nFull Disk Access. macOS TCC grants access by binary and responsible process,\nso `mdfind` can return filtered results without an error. The same pattern\naffects the OneDrive warmup daemon.\n\nFix on macOS: add the service's Python binary to **System Settings > Privacy &\nSecurity > Full Disk Access**. Locate the configured binary in the private\nservice definition or process manager.\n\nThen restart it through the owning private provisioning tool so TCC reevaluates\naccess. As a temporary diagnostic alternative, stop the background service and run\n`host_open_helper.py` manually from a Terminal process that already has Full\nDisk Access.\n",{"name":5,"description":7},"main","ddf5fc580ae6656e98e3222889a9c49181664a45","pipeline\u002Fskills\u002Fhost_open_helper",0,"https:\u002F\u002Fgithub.com\u002Fismigar\u002FGnosi","https:\u002F\u002Fgnosi.temenosismael.org","https:\u002F\u002Fgithub.com\u002Fismigar","https:\u002F\u002Ftemenosismael.org","💻 & 📚 Computer scientist & philosopher. Exploring the intersection of tech & philosophy for social change & the common good.","2026-11-13 03:31:26",{"source":8,"skillName":5,"commands":53,"prompt":63,"zipAvailable":64},[54,57,60],{"tool":55,"command":56},"npx","npx skills add ismigar\u002FGnosi --skill host-open-helper",{"tool":58,"command":59},"bunx","bunx skills add ismigar\u002FGnosi --skill host-open-helper",{"tool":61,"command":62},"pnpm","pnpm dlx skills add ismigar\u002FGnosi --skill host-open-helper","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fismigar\u002FGnosi\u002Fblob\u002Fmain\u002Fpipeline\u002Fskills\u002Fhost_open_helper\u002FSKILL.md",true,[66],{"path":67,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":70,"sourceHtmlUrl":71},"scripts\u002Fhost_open_helper.py","SCRIPT","脚本",20942,"https:\u002F\u002Fgithub.com\u002Fismigar\u002FGnosi\u002Fblob\u002Fmain\u002Fpipeline\u002Fskills\u002Fhost_open_helper\u002Fscripts\u002Fhost_open_helper.py",[73,93,115,137,153,171],{"skillNo":74,"name":75,"nameZh":6,"description":76,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":77,"categories":78,"keywords":79,"publishedAt":37},"01M6K1XMNQTR2Z9F0HV40M9CV6","zotero-sync-compatibility","Preserve the historical Zotero reference-table configuration path after Gnosi replaced bidirectional Zotero synchronization with its native reference manager.","https:\u002F\u002Fgithub.com\u002Fismigar\u002FGnosi\u002Fblob\u002Fmain\u002Fpipeline\u002Fskills\u002Fzotero_sync\u002FSKILL.md",[],[80,81,82,83,84,85,86,87,88,89,90,91,92],"sync","Zotero","compatibility","zotero sync compatibility","preserve","path","manager","with","native","configuration","reference","synchronization","table",{"skillNo":94,"name":95,"nameZh":6,"description":96,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":97,"categories":98,"keywords":99,"publishedAt":37},"01M6K1XE33SSY5RXR5D4S8Y4RV","zotero-schema","Generate Gnosi's Python and TypeScript item-type constants from the repository-pinned Zotero schema, or perform an explicitly requested pinned schema refresh. Use for mapping or generated-constant maintenance, not runtime downloads.","https:\u002F\u002Fgithub.com\u002Fismigar\u002FGnosi\u002Fblob\u002Fmain\u002Fpipeline\u002Fskills\u002Fzotero_schema\u002FSKILL.md",[],[81,100,101,102,103,104,105,106,26,107,108,109,110,111,112,113,114],"schema","zotero schema","generate","python","typescript","constants","repository","mapping","type","runtime","maintenance","use","generated","refresh","downloads",{"skillNo":116,"name":117,"nameZh":6,"description":118,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":119,"categories":120,"keywords":121,"publishedAt":37},"01M6K1X9M6AKK8JTQJA9G37ZRP","vault-core","Preserve Gnosi vault identifiers, internal links and active-vault context during file or metadata changes. Use for vault integrity work, not blanket normalization or cleanup of user documents.","https:\u002F\u002Fgithub.com\u002Fismigar\u002FGnosi\u002Fblob\u002Fmain\u002Fpipeline\u002Fskills\u002Fvault_core\u002FSKILL.md",[],[122,123,124,125,84,126,26,127,128,111,129,130,131,132,133,134,135,136],"vault core","core","vault","integrity","changes","links","active","user","context","work","normalization","metadata","cleanup","documents","file",{"skillNo":138,"name":139,"nameZh":6,"description":140,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":141,"categories":142,"keywords":143,"publishedAt":37},"01M6K1X4TE0YP62D789CJWZ4YY","translate-row","Translate configured table-row fields and Markdown into language children, updating existing translations in place. Use for the explicit translate-row action or maintenance of its provider adapters.","https:\u002F\u002Fgithub.com\u002Fismigar\u002FGnosi\u002Fblob\u002Fmain\u002Fpipeline\u002Fskills\u002Ftranslate_row\u002FSKILL.md",[],[144,145,146,110,147,26,148,149,128,150,151,111,92,152],"translate","translate row","fields","Existing","action","Adapters","language","provider","markdown",{"skillNo":154,"name":155,"nameZh":6,"description":156,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":157,"categories":158,"keywords":164,"publishedAt":37},"01M6K1X0G5C2E91RS71NMX0GHG","translate-page","Translate a Vault page title and Markdown body into language children, updating existing translations and preserving Gnosi directives. Use for the explicit translate-page action or Markdown segmentation maintenance.","https:\u002F\u002Fgithub.com\u002Fismigar\u002FGnosi\u002Fblob\u002Fmain\u002Fpipeline\u002Fskills\u002Ftranslate_page\u002FSKILL.md",[159],{"categoryNo":160,"categoryName":161,"taxonomyType":162,"taxonomyTypeDesc":163},"01JBSEEDCAT000000000000002","文档处理","SCENARIO","使用场景",[165,144,166,110,111,152,124,167,150,168,169,170,147,26,148,128],"page","translate page","segmentation","body","title","directives",{"skillNo":172,"name":173,"nameZh":6,"description":174,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":175,"categories":176,"keywords":177,"publishedAt":37},"01M6K1WSRJTN93ZY4VPNZ2BJW3","technical-documentation","Generate and validate Gnosi's engineering portal from reviewed guides and deterministic source catalogs. Use for source-traceable documentation updates and pre-PR gates; never translate generated catalogs with a model.","https:\u002F\u002Fgithub.com\u002Fismigar\u002FGnosi\u002Fblob\u002Fmain\u002Fpipeline\u002Fskills\u002Ftechnical_documentation\u002FSKILL.md",[],[178,179,180,181,182,26,183,87,184,185,186,111,112,187,188,102,189,190,144],"technical","technical documentation","documentation","gates","source","updates","guides","deterministic","never","model","engineering","pr","validate"]