From 52edbbbce1a7a528c25d90aae0d3c2c5e866220f Mon Sep 17 00:00:00 2001 From: ranxianglei Date: Mon, 27 Jul 2026 20:35:13 +0800 Subject: [PATCH 1/7] fix(ci): commit bun.lock, drop stale package-lock.json CI's `bun install --frozen-lockfile` was failing on every run because the repo tracked npm's package-lock.json instead of bun.lock. Bun found no bun.lock, migrated from the stale package-lock.json, detected drift vs package.json, and exited 1. This had been red for 5 consecutive pushes. Switch to bun.lock (the project is fully bun-based: CI uses setup-bun, all scripts use bun, runtime is bun). gitignore package-lock.json so a stray `npm install` can't reintroduce the drift. Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode) Co-authored-by: Sisyphus --- .gitignore | 1 + bun.lock | 221 +++++++++ package-lock.json | 1084 --------------------------------------------- 3 files changed, 222 insertions(+), 1084 deletions(-) create mode 100644 bun.lock delete mode 100644 package-lock.json diff --git a/.gitignore b/.gitignore index 2e8157a..14eb876 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ node_modules/ .env *.log +package-lock.json diff --git a/bun.lock b/bun.lock new file mode 100644 index 0000000..5ad5a46 --- /dev/null +++ b/bun.lock @@ -0,0 +1,221 @@ +{ + "lockfileVersion": 1, + "configVersion": 0, + "workspaces": { + "": { + "name": "ework-aio", + "dependencies": { + "ework-daemon": "^0.4.1", + "ework-router": "^0.1.5", + "ework-web": "^0.10.15", + "opencode-ework": "^0.1.0", + "zod": "^3.23.0", + }, + "devDependencies": { + "@types/bun": "latest", + "typescript": "^5.4.0", + }, + }, + }, + "packages": { + "@ai-sdk/provider": ["@ai-sdk/provider@3.0.8", "", { "dependencies": { "json-schema": "^0.4.0" } }, ""], + + "@asamuzakjp/css-color": ["@asamuzakjp/css-color@5.1.11", "", { "dependencies": { "@asamuzakjp/generational-cache": "^1.0.1", "@csstools/css-calc": "^3.2.0", "@csstools/css-color-parser": "^4.1.0", "@csstools/css-parser-algorithms": "^4.0.0", "@csstools/css-tokenizer": "^4.0.0" } }, ""], + + "@asamuzakjp/dom-selector": ["@asamuzakjp/dom-selector@7.1.1", "", { "dependencies": { "@asamuzakjp/generational-cache": "^1.0.1", "@asamuzakjp/nwsapi": "^2.3.9", "bidi-js": "^1.0.3", "css-tree": "^3.2.1", "is-potential-custom-element-name": "^1.0.1" } }, ""], + + "@asamuzakjp/generational-cache": ["@asamuzakjp/generational-cache@1.0.1", "", {}, ""], + + "@asamuzakjp/nwsapi": ["@asamuzakjp/nwsapi@2.3.9", "", {}, ""], + + "@bramus/specificity": ["@bramus/specificity@2.4.2", "", { "dependencies": { "css-tree": "^3.0.0" }, "bin": { "specificity": "bin/cli.js" } }, ""], + + "@csstools/color-helpers": ["@csstools/color-helpers@6.1.0", "", {}, ""], + + "@csstools/css-calc": ["@csstools/css-calc@3.2.1", "", { "peerDependencies": { "@csstools/css-parser-algorithms": "^4.0.0", "@csstools/css-tokenizer": "^4.0.0" } }, ""], + + "@csstools/css-color-parser": ["@csstools/css-color-parser@4.1.9", "", { "dependencies": { "@csstools/color-helpers": "^6.1.0", "@csstools/css-calc": "^3.2.1" }, "peerDependencies": { "@csstools/css-parser-algorithms": "^4.0.0", "@csstools/css-tokenizer": "^4.0.0" } }, ""], + + "@csstools/css-parser-algorithms": ["@csstools/css-parser-algorithms@4.0.0", "", { "peerDependencies": { "@csstools/css-tokenizer": "^4.0.0" } }, ""], + + "@csstools/css-syntax-patches-for-csstree": ["@csstools/css-syntax-patches-for-csstree@1.1.6", "", { "peerDependencies": { "css-tree": "^3.2.1" } }, ""], + + "@csstools/css-tokenizer": ["@csstools/css-tokenizer@4.0.0", "", {}, ""], + + "@exodus/bytes": ["@exodus/bytes@1.15.1", "", { "peerDependencies": { "@noble/hashes": "^1.8.0 || ^2.0.0" }, "optionalPeers": ["@noble/hashes"] }, ""], + + "@msgpackr-extract/msgpackr-extract-darwin-arm64": ["@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-LCkGo6JDfaBhgST7UpPWgNgLINpcpabaHfyz5OBx75nUYxBsaEPxjnyNjWpeb/xBup/682QnBfRBy2/LvPutZQ=="], + + "@msgpackr-extract/msgpackr-extract-darwin-x64": ["@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-zExlW9zUJKZH/tOtVMttwjKa4Xm/3KcNjnE3dPN92uCktwavMxpgCA3MoJK/DOnTWsQgo224OaST27/mPNAf+w=="], + + "@msgpackr-extract/msgpackr-extract-linux-arm": ["@msgpackr-extract/msgpackr-extract-linux-arm@3.0.4", "", { "os": "linux", "cpu": "arm" }, "sha512-Tg3yX65f5GbtXLkrYEHE5oibZG9epyYWas7FogTTEJeDEF9JlXJzKgXaNhT3UXlTOeA+AfZpYZYZ0uPj7Cfquw=="], + + "@msgpackr-extract/msgpackr-extract-linux-arm64": ["@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-dgX0P/9wGPJeHFBG+ZmhgE6bmtMt7NP5CRBGyyktpopdk/mW4POnrpQsSLtKI1dwpc+pPLuXHDh6vvskyQE/sw=="], + + "@msgpackr-extract/msgpackr-extract-linux-x64": ["@msgpackr-extract/msgpackr-extract-linux-x64@3.0.4", "", { "os": "linux", "cpu": "x64" }, ""], + + "@msgpackr-extract/msgpackr-extract-win32-x64": ["@msgpackr-extract/msgpackr-extract-win32-x64@3.0.4", "", { "os": "win32", "cpu": "x64" }, "sha512-CmCXPQrkbwExx3j946/PtHWHbYJiCRBRDl4BlkRQcJB/YOwQxJRTpoo7aTsortjgoJ1x7opzTSxn7C+ASSLVjQ=="], + + "@opencode-ai/plugin": ["@opencode-ai/plugin@1.18.3", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@opencode-ai/sdk": "1.18.3", "effect": "4.0.0-beta.83", "zod": "4.1.8" }, "peerDependencies": { "@opentui/core": ">=0.4.3", "@opentui/keymap": ">=0.4.3", "@opentui/solid": ">=0.4.3" }, "optionalPeers": ["@opentui/core", "@opentui/keymap", "@opentui/solid"] }, ""], + + "@opencode-ai/sdk": ["@opencode-ai/sdk@1.18.3", "", { "dependencies": { "cross-spawn": "7.0.6" } }, ""], + + "@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, ""], + + "@types/bun": ["@types/bun@1.3.14", "", { "dependencies": { "bun-types": "1.3.14" } }, "sha512-h1hFqFVcvAvD9j9K7ZW7vd82aSA+rTdznZa+5bwvCwqSB1jmmfLcbIWhOLx1/+boy/xmjgCs/OMUL8hRJSmnPw=="], + + "@types/dompurify": ["@types/dompurify@3.2.0", "", { "dependencies": { "dompurify": "*" } }, ""], + + "@types/node": ["@types/node@26.1.1", "", { "dependencies": { "undici-types": "~8.3.0" } }, ""], + + "@types/trusted-types": ["@types/trusted-types@2.0.7", "", {}, ""], + + "aws-ssl-profiles": ["aws-ssl-profiles@1.1.2", "", {}, "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g=="], + + "bidi-js": ["bidi-js@1.0.3", "", { "dependencies": { "require-from-string": "^2.0.2" } }, ""], + + "bun-types": ["bun-types@1.3.14", "", { "dependencies": { "@types/node": "*" } }, ""], + + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, ""], + + "css-tree": ["css-tree@3.2.1", "", { "dependencies": { "mdn-data": "2.27.1", "source-map-js": "^1.2.1" } }, ""], + + "data-urls": ["data-urls@7.0.0", "", { "dependencies": { "whatwg-mimetype": "^5.0.0", "whatwg-url": "^16.0.0" } }, ""], + + "decimal.js": ["decimal.js@10.6.0", "", {}, ""], + + "denque": ["denque@2.1.0", "", {}, "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw=="], + + "detect-libc": ["detect-libc@2.1.2", "", {}, ""], + + "dompurify": ["dompurify@3.4.12", "", { "optionalDependencies": { "@types/trusted-types": "^2.0.7" } }, ""], + + "effect": ["effect@4.0.0-beta.83", "", { "dependencies": { "@standard-schema/spec": "^1.1.0", "fast-check": "^4.8.0", "find-my-way-ts": "^0.1.6", "ini": "^7.0.0", "kubernetes-types": "^1.30.0", "msgpackr": "^2.0.1", "multipasta": "^0.2.7", "toml": "^4.1.1", "uuid": "^14.0.0", "yaml": "^2.9.0" } }, ""], + + "entities": ["entities@8.0.0", "", {}, ""], + + "ework-daemon": ["ework-daemon@0.4.4", "", { "dependencies": { "mysql2": "^3.23.1", "zod": "^4.4.3" }, "peerDependencies": { "typescript": "^5" }, "bin": { "ework-daemon": "src/cli.ts", "ework-daemon-server": "bin/ework-daemon-server.js" } }, "sha512-RY/4vMxT2DAYgc5cT42bp3DpomltvvKwy7rcOiXVzLtoxDd1GlnJtbAwGJCq1JP7PKQNn8XcqUhLc9T224kD2Q=="], + + "ework-router": ["ework-router@0.1.5", "", { "dependencies": { "mysql2": "^3.11.0", "zod": "^4.4.3" }, "bin": "bin/ework-router.js" }, "sha512-LRoN630z9IQvFe81tRE0mvXAfHDRnIHK1OLU7dtkPESaRXNc+QKlLuAOnu+rXPe0w5usutpzE6u0omb7plnLuQ=="], + + "ework-web": ["ework-web@0.10.15", "", { "dependencies": { "@types/dompurify": "^3.2.0", "dompurify": "^3.4.11", "highlight.js": "^11.10.0", "jsdom": "^29.1.1", "marked": "^15.0.0", "marked-highlight": "^2.2.0", "mysql2": "^3.23.1", "zod": "^3.23.8" }, "bin": "bin/ework-web.js" }, "sha512-WpRyy9epI/W4pm/0Grg8Z8SlB8uRxXFFQLsa8Ki9wTgA4FdrtGyi4/GcfwpcQwOP1GwXBq8tSPlLhF7Jc9+DVA=="], + + "fast-check": ["fast-check@4.9.0", "", { "dependencies": { "pure-rand": "^8.0.0" } }, ""], + + "find-my-way-ts": ["find-my-way-ts@0.1.6", "", {}, ""], + + "generate-function": ["generate-function@2.3.1", "", { "dependencies": { "is-property": "^1.0.2" } }, "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ=="], + + "highlight.js": ["highlight.js@11.11.1", "", {}, ""], + + "html-encoding-sniffer": ["html-encoding-sniffer@6.0.0", "", { "dependencies": { "@exodus/bytes": "^1.6.0" } }, ""], + + "iconv-lite": ["iconv-lite@0.7.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ=="], + + "ini": ["ini@7.0.0", "", {}, ""], + + "is-potential-custom-element-name": ["is-potential-custom-element-name@1.0.1", "", {}, ""], + + "is-property": ["is-property@1.0.2", "", {}, "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g=="], + + "isexe": ["isexe@2.0.0", "", {}, ""], + + "jsdom": ["jsdom@29.1.1", "", { "dependencies": { "@asamuzakjp/css-color": "^5.1.11", "@asamuzakjp/dom-selector": "^7.1.1", "@bramus/specificity": "^2.4.2", "@csstools/css-syntax-patches-for-csstree": "^1.1.3", "@exodus/bytes": "^1.15.0", "css-tree": "^3.2.1", "data-urls": "^7.0.0", "decimal.js": "^10.6.0", "html-encoding-sniffer": "^6.0.0", "is-potential-custom-element-name": "^1.0.1", "lru-cache": "^11.3.5", "parse5": "^8.0.1", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", "tough-cookie": "^6.0.1", "undici": "^7.25.0", "w3c-xmlserializer": "^5.0.0", "webidl-conversions": "^8.0.1", "whatwg-mimetype": "^5.0.0", "whatwg-url": "^16.0.1", "xml-name-validator": "^5.0.0" }, "peerDependencies": { "canvas": "^3.0.0" }, "optionalPeers": ["canvas"] }, ""], + + "json-schema": ["json-schema@0.4.0", "", {}, ""], + + "kubernetes-types": ["kubernetes-types@1.30.0", "", {}, ""], + + "long": ["long@5.3.2", "", {}, "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA=="], + + "lru-cache": ["lru-cache@11.5.2", "", {}, ""], + + "lru.min": ["lru.min@1.1.4", "", {}, "sha512-DqC6n3QQ77zdFpCMASA1a3Jlb64Hv2N2DciFGkO/4L9+q/IpIAuRlKOvCXabtRW6cQf8usbmM6BE/TOPysCdIA=="], + + "marked": ["marked@15.0.12", "", { "bin": "bin/marked.js" }, ""], + + "marked-highlight": ["marked-highlight@2.2.4", "", { "peerDependencies": { "marked": ">=4 <19" } }, ""], + + "mdn-data": ["mdn-data@2.27.1", "", {}, ""], + + "msgpackr": ["msgpackr@2.0.4", "", { "optionalDependencies": { "msgpackr-extract": "^3.0.4" } }, ""], + + "msgpackr-extract": ["msgpackr-extract@3.0.4", "", { "dependencies": { "node-gyp-build-optional-packages": "5.2.2" }, "optionalDependencies": { "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.4", "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.4", "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.4", "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.4", "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.4", "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.4" }, "bin": { "download-msgpackr-prebuilds": "bin/download-prebuilds.js" } }, ""], + + "multipasta": ["multipasta@0.2.8", "", {}, ""], + + "mysql2": ["mysql2@3.23.1", "", { "dependencies": { "aws-ssl-profiles": "^1.1.2", "denque": "^2.1.0", "generate-function": "^2.3.1", "iconv-lite": "^0.7.2", "long": "^5.3.2", "lru.min": "^1.1.4", "named-placeholders": "^1.1.6", "sql-escaper": "^1.5.1" }, "peerDependencies": { "@types/node": ">= 8" } }, "sha512-tTuRnC7qCet2IOfSNMYZ5SwXuBnfvBPAcIA28P0gtruXyZlU1LMxA6uha32kYypoFgyYklMqhLWwt4laYwXR/Q=="], + + "named-placeholders": ["named-placeholders@1.1.6", "", { "dependencies": { "lru.min": "^1.1.0" } }, "sha512-Tz09sEL2EEuv5fFowm419c1+a/jSMiBjI9gHxVLrVdbUkkNUUfjsVYs9pVZu5oCon/kmRh9TfLEObFtkVxmY0w=="], + + "node-gyp-build-optional-packages": ["node-gyp-build-optional-packages@5.2.2", "", { "dependencies": { "detect-libc": "^2.0.1" }, "bin": { "node-gyp-build-optional-packages": "bin.js", "node-gyp-build-optional-packages-optional": "optional.js", "node-gyp-build-optional-packages-test": "build-test.js" } }, ""], + + "opencode-ework": ["opencode-ework@0.1.0", "", { "dependencies": { "@opencode-ai/plugin": "^1.4.3" } }, ""], + + "parse5": ["parse5@8.0.1", "", { "dependencies": { "entities": "^8.0.0" } }, ""], + + "path-key": ["path-key@3.1.1", "", {}, ""], + + "punycode": ["punycode@2.3.1", "", {}, ""], + + "pure-rand": ["pure-rand@8.4.2", "", {}, ""], + + "require-from-string": ["require-from-string@2.0.2", "", {}, ""], + + "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], + + "saxes": ["saxes@6.0.0", "", { "dependencies": { "xmlchars": "^2.2.0" } }, ""], + + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, ""], + + "shebang-regex": ["shebang-regex@3.0.0", "", {}, ""], + + "source-map-js": ["source-map-js@1.2.1", "", {}, ""], + + "sql-escaper": ["sql-escaper@1.5.1", "", {}, "sha512-4toX5E1fQbBrpfXidaHnF0669nkAdETeIPTs2SUjxxD7RRIs9ICG4gtpmfc68JCEKehsdwLFqBu9VlQqZ1P1gg=="], + + "symbol-tree": ["symbol-tree@3.2.4", "", {}, ""], + + "tldts": ["tldts@7.4.9", "", { "dependencies": { "tldts-core": "^7.4.9" }, "bin": "bin/cli.js" }, ""], + + "tldts-core": ["tldts-core@7.4.9", "", {}, ""], + + "toml": ["toml@4.3.0", "", {}, ""], + + "tough-cookie": ["tough-cookie@6.0.2", "", { "dependencies": { "tldts": "^7.0.5" } }, ""], + + "tr46": ["tr46@6.0.0", "", { "dependencies": { "punycode": "^2.3.1" } }, ""], + + "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, ""], + + "undici": ["undici@7.28.0", "", {}, ""], + + "undici-types": ["undici-types@8.3.0", "", {}, ""], + + "uuid": ["uuid@14.0.1", "", { "bin": "dist-node/bin/uuid" }, ""], + + "w3c-xmlserializer": ["w3c-xmlserializer@5.0.0", "", { "dependencies": { "xml-name-validator": "^5.0.0" } }, ""], + + "webidl-conversions": ["webidl-conversions@8.0.1", "", {}, ""], + + "whatwg-mimetype": ["whatwg-mimetype@5.0.0", "", {}, ""], + + "whatwg-url": ["whatwg-url@16.0.1", "", { "dependencies": { "@exodus/bytes": "^1.11.0", "tr46": "^6.0.0", "webidl-conversions": "^8.0.1" } }, ""], + + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "bin/node-which" } }, ""], + + "xml-name-validator": ["xml-name-validator@5.0.0", "", {}, ""], + + "xmlchars": ["xmlchars@2.2.0", "", {}, ""], + + "yaml": ["yaml@2.9.0", "", { "bin": "bin.mjs" }, ""], + + "zod": ["zod@3.25.76", "", {}, ""], + + "@opencode-ai/plugin/zod": ["zod@4.1.8", "", {}, ""], + + "ework-daemon/zod": ["zod@4.4.3", "", {}, ""], + + "ework-router/zod": ["zod@4.4.3", "", {}, "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ=="], + } +} diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 868f6aa..0000000 --- a/package-lock.json +++ /dev/null @@ -1,1084 +0,0 @@ -{ - "name": "ework-aio", - "version": "0.5.34", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "ework-aio", - "version": "0.5.34", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "ework-daemon": "^0.4.1", - "ework-router": "^0.1.5", - "ework-web": "^0.10.15", - "opencode-ework": "^0.1.0", - "zod": "^3.23.0" - }, - "bin": { - "ework-aio": "bin/ework-aio" - }, - "devDependencies": { - "@types/bun": "latest", - "typescript": "^5.4.0" - }, - "engines": { - "bun": ">=1.1.0" - } - }, - "node_modules/@ai-sdk/provider": { - "version": "3.0.8", - "license": "Apache-2.0", - "dependencies": { - "json-schema": "^0.4.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@asamuzakjp/css-color": { - "version": "5.1.11", - "license": "MIT", - "dependencies": { - "@asamuzakjp/generational-cache": "^1.0.1", - "@csstools/css-calc": "^3.2.0", - "@csstools/css-color-parser": "^4.1.0", - "@csstools/css-parser-algorithms": "^4.0.0", - "@csstools/css-tokenizer": "^4.0.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - } - }, - "node_modules/@asamuzakjp/dom-selector": { - "version": "7.1.1", - "license": "MIT", - "dependencies": { - "@asamuzakjp/generational-cache": "^1.0.1", - "@asamuzakjp/nwsapi": "^2.3.9", - "bidi-js": "^1.0.3", - "css-tree": "^3.2.1", - "is-potential-custom-element-name": "^1.0.1" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - } - }, - "node_modules/@asamuzakjp/generational-cache": { - "version": "1.0.1", - "license": "MIT", - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - } - }, - "node_modules/@asamuzakjp/nwsapi": { - "version": "2.3.9", - "license": "MIT" - }, - "node_modules/@bramus/specificity": { - "version": "2.4.2", - "license": "MIT", - "dependencies": { - "css-tree": "^3.0.0" - }, - "bin": { - "specificity": "bin/cli.js" - } - }, - "node_modules/@csstools/color-helpers": { - "version": "6.1.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=20.19.0" - } - }, - "node_modules/@csstools/css-calc": { - "version": "3.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=20.19.0" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^4.0.0", - "@csstools/css-tokenizer": "^4.0.0" - } - }, - "node_modules/@csstools/css-color-parser": { - "version": "4.1.9", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/color-helpers": "^6.1.0", - "@csstools/css-calc": "^3.2.1" - }, - "engines": { - "node": ">=20.19.0" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^4.0.0", - "@csstools/css-tokenizer": "^4.0.0" - } - }, - "node_modules/@csstools/css-parser-algorithms": { - "version": "4.0.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=20.19.0" - }, - "peerDependencies": { - "@csstools/css-tokenizer": "^4.0.0" - } - }, - "node_modules/@csstools/css-syntax-patches-for-csstree": { - "version": "1.1.6", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "peerDependencies": { - "css-tree": "^3.2.1" - }, - "peerDependenciesMeta": { - "css-tree": { - "optional": true - } - } - }, - "node_modules/@csstools/css-tokenizer": { - "version": "4.0.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=20.19.0" - } - }, - "node_modules/@exodus/bytes": { - "version": "1.15.1", - "license": "MIT", - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - }, - "peerDependencies": { - "@noble/hashes": "^1.8.0 || ^2.0.0" - }, - "peerDependenciesMeta": { - "@noble/hashes": { - "optional": true - } - } - }, - "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.4.tgz", - "integrity": "sha512-LCkGo6JDfaBhgST7UpPWgNgLINpcpabaHfyz5OBx75nUYxBsaEPxjnyNjWpeb/xBup/682QnBfRBy2/LvPutZQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.4.tgz", - "integrity": "sha512-zExlW9zUJKZH/tOtVMttwjKa4Xm/3KcNjnE3dPN92uCktwavMxpgCA3MoJK/DOnTWsQgo224OaST27/mPNAf+w==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.4.tgz", - "integrity": "sha512-Tg3yX65f5GbtXLkrYEHE5oibZG9epyYWas7FogTTEJeDEF9JlXJzKgXaNhT3UXlTOeA+AfZpYZYZ0uPj7Cfquw==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.4.tgz", - "integrity": "sha512-dgX0P/9wGPJeHFBG+ZmhgE6bmtMt7NP5CRBGyyktpopdk/mW4POnrpQsSLtKI1dwpc+pPLuXHDh6vvskyQE/sw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { - "version": "3.0.4", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.4.tgz", - "integrity": "sha512-CmCXPQrkbwExx3j946/PtHWHbYJiCRBRDl4BlkRQcJB/YOwQxJRTpoo7aTsortjgoJ1x7opzTSxn7C+ASSLVjQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@opencode-ai/plugin": { - "version": "1.18.3", - "license": "MIT", - "dependencies": { - "@ai-sdk/provider": "3.0.8", - "@opencode-ai/sdk": "1.18.3", - "effect": "4.0.0-beta.83", - "zod": "4.1.8" - }, - "peerDependencies": { - "@opentui/core": ">=0.4.3", - "@opentui/keymap": ">=0.4.3", - "@opentui/solid": ">=0.4.3" - }, - "peerDependenciesMeta": { - "@opentui/core": { - "optional": true - }, - "@opentui/keymap": { - "optional": true - }, - "@opentui/solid": { - "optional": true - } - } - }, - "node_modules/@opencode-ai/plugin/node_modules/zod": { - "version": "4.1.8", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/@opencode-ai/sdk": { - "version": "1.18.3", - "license": "MIT", - "dependencies": { - "cross-spawn": "7.0.6" - } - }, - "node_modules/@standard-schema/spec": { - "version": "1.1.0", - "license": "MIT" - }, - "node_modules/@types/bun": { - "version": "1.3.14", - "resolved": "https://registry.npmjs.org/@types/bun/-/bun-1.3.14.tgz", - "integrity": "sha512-h1hFqFVcvAvD9j9K7ZW7vd82aSA+rTdznZa+5bwvCwqSB1jmmfLcbIWhOLx1/+boy/xmjgCs/OMUL8hRJSmnPw==", - "dev": true, - "license": "MIT", - "dependencies": { - "bun-types": "1.3.14" - } - }, - "node_modules/@types/dompurify": { - "version": "3.2.0", - "deprecated": "This is a stub types definition. dompurify provides its own type definitions, so you do not need this installed.", - "license": "MIT", - "dependencies": { - "dompurify": "*" - } - }, - "node_modules/@types/node": { - "version": "26.1.1", - "license": "MIT", - "dependencies": { - "undici-types": "~8.3.0" - } - }, - "node_modules/@types/trusted-types": { - "version": "2.0.7", - "license": "MIT", - "optional": true - }, - "node_modules/aws-ssl-profiles": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz", - "integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==", - "license": "MIT", - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/bidi-js": { - "version": "1.0.3", - "license": "MIT", - "dependencies": { - "require-from-string": "^2.0.2" - } - }, - "node_modules/bun-types": { - "version": "1.3.14", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/css-tree": { - "version": "3.2.1", - "license": "MIT", - "dependencies": { - "mdn-data": "2.27.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, - "node_modules/data-urls": { - "version": "7.0.0", - "license": "MIT", - "dependencies": { - "whatwg-mimetype": "^5.0.0", - "whatwg-url": "^16.0.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - } - }, - "node_modules/decimal.js": { - "version": "10.6.0", - "license": "MIT" - }, - "node_modules/denque": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", - "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/dompurify": { - "version": "3.4.12", - "license": "(MPL-2.0 OR Apache-2.0)", - "optionalDependencies": { - "@types/trusted-types": "^2.0.7" - } - }, - "node_modules/effect": { - "version": "4.0.0-beta.83", - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.1.0", - "fast-check": "^4.8.0", - "find-my-way-ts": "^0.1.6", - "ini": "^7.0.0", - "kubernetes-types": "^1.30.0", - "msgpackr": "^2.0.1", - "multipasta": "^0.2.7", - "toml": "^4.1.1", - "uuid": "^14.0.0", - "yaml": "^2.9.0" - } - }, - "node_modules/entities": { - "version": "8.0.0", - "license": "BSD-2-Clause", - "engines": { - "node": ">=20.19.0" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/ework-daemon": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/ework-daemon/-/ework-daemon-0.4.4.tgz", - "integrity": "sha512-RY/4vMxT2DAYgc5cT42bp3DpomltvvKwy7rcOiXVzLtoxDd1GlnJtbAwGJCq1JP7PKQNn8XcqUhLc9T224kD2Q==", - "license": "MIT", - "dependencies": { - "mysql2": "^3.23.1", - "zod": "^4.4.3" - }, - "bin": { - "ework-daemon": "src/cli.ts", - "ework-daemon-server": "bin/ework-daemon-server.js" - }, - "engines": { - "bun": ">=1.1.0" - }, - "peerDependencies": { - "typescript": "^5" - } - }, - "node_modules/ework-daemon/node_modules/zod": { - "version": "4.4.3", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/ework-router": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/ework-router/-/ework-router-0.1.5.tgz", - "integrity": "sha512-LRoN630z9IQvFe81tRE0mvXAfHDRnIHK1OLU7dtkPESaRXNc+QKlLuAOnu+rXPe0w5usutpzE6u0omb7plnLuQ==", - "dependencies": { - "mysql2": "^3.11.0", - "zod": "^4.4.3" - }, - "bin": { - "ework-router": "bin/ework-router.js" - } - }, - "node_modules/ework-router/node_modules/zod": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", - "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/ework-web": { - "version": "0.10.15", - "resolved": "https://registry.npmjs.org/ework-web/-/ework-web-0.10.15.tgz", - "integrity": "sha512-WpRyy9epI/W4pm/0Grg8Z8SlB8uRxXFFQLsa8Ki9wTgA4FdrtGyi4/GcfwpcQwOP1GwXBq8tSPlLhF7Jc9+DVA==", - "license": "MIT", - "dependencies": { - "@types/dompurify": "^3.2.0", - "dompurify": "^3.4.11", - "highlight.js": "^11.10.0", - "jsdom": "^29.1.1", - "marked": "^15.0.0", - "marked-highlight": "^2.2.0", - "mysql2": "^3.23.1", - "zod": "^3.23.8" - }, - "bin": { - "ework-web": "bin/ework-web.js" - }, - "engines": { - "bun": ">=1.1.0" - } - }, - "node_modules/fast-check": { - "version": "4.9.0", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ], - "license": "MIT", - "dependencies": { - "pure-rand": "^8.0.0" - }, - "engines": { - "node": ">=12.17.0" - } - }, - "node_modules/find-my-way-ts": { - "version": "0.1.6", - "license": "MIT" - }, - "node_modules/generate-function": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", - "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", - "license": "MIT", - "dependencies": { - "is-property": "^1.0.2" - } - }, - "node_modules/highlight.js": { - "version": "11.11.1", - "license": "BSD-3-Clause", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/html-encoding-sniffer": { - "version": "6.0.0", - "license": "MIT", - "dependencies": { - "@exodus/bytes": "^1.6.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.3.tgz", - "integrity": "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/ini": { - "version": "7.0.0", - "license": "ISC", - "engines": { - "node": "^22.22.2 || ^24.15.0 || >=26.0.0" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "license": "MIT" - }, - "node_modules/is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==", - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "license": "ISC" - }, - "node_modules/jsdom": { - "version": "29.1.1", - "license": "MIT", - "dependencies": { - "@asamuzakjp/css-color": "^5.1.11", - "@asamuzakjp/dom-selector": "^7.1.1", - "@bramus/specificity": "^2.4.2", - "@csstools/css-syntax-patches-for-csstree": "^1.1.3", - "@exodus/bytes": "^1.15.0", - "css-tree": "^3.2.1", - "data-urls": "^7.0.0", - "decimal.js": "^10.6.0", - "html-encoding-sniffer": "^6.0.0", - "is-potential-custom-element-name": "^1.0.1", - "lru-cache": "^11.3.5", - "parse5": "^8.0.1", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^6.0.1", - "undici": "^7.25.0", - "w3c-xmlserializer": "^5.0.0", - "webidl-conversions": "^8.0.1", - "whatwg-mimetype": "^5.0.0", - "whatwg-url": "^16.0.1", - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24.0.0" - }, - "peerDependencies": { - "canvas": "^3.0.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/json-schema": { - "version": "0.4.0", - "license": "(AFL-2.1 OR BSD-3-Clause)" - }, - "node_modules/kubernetes-types": { - "version": "1.30.0", - "license": "Apache-2.0" - }, - "node_modules/long": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", - "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", - "license": "Apache-2.0" - }, - "node_modules/lru-cache": { - "version": "11.5.2", - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/lru.min": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.4.tgz", - "integrity": "sha512-DqC6n3QQ77zdFpCMASA1a3Jlb64Hv2N2DciFGkO/4L9+q/IpIAuRlKOvCXabtRW6cQf8usbmM6BE/TOPysCdIA==", - "license": "MIT", - "engines": { - "bun": ">=1.0.0", - "deno": ">=1.30.0", - "node": ">=8.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wellwelwel" - } - }, - "node_modules/marked": { - "version": "15.0.12", - "license": "MIT", - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/marked-highlight": { - "version": "2.2.4", - "license": "MIT", - "peerDependencies": { - "marked": ">=4 <19" - } - }, - "node_modules/mdn-data": { - "version": "2.27.1", - "license": "CC0-1.0" - }, - "node_modules/msgpackr": { - "version": "2.0.4", - "license": "MIT", - "optionalDependencies": { - "msgpackr-extract": "^3.0.4" - } - }, - "node_modules/msgpackr-extract": { - "version": "3.0.4", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "node-gyp-build-optional-packages": "5.2.2" - }, - "bin": { - "download-msgpackr-prebuilds": "bin/download-prebuilds.js" - }, - "optionalDependencies": { - "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.4", - "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.4", - "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.4", - "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.4", - "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.4", - "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.4" - } - }, - "node_modules/multipasta": { - "version": "0.2.8", - "license": "MIT" - }, - "node_modules/mysql2": { - "version": "3.23.1", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.23.1.tgz", - "integrity": "sha512-tTuRnC7qCet2IOfSNMYZ5SwXuBnfvBPAcIA28P0gtruXyZlU1LMxA6uha32kYypoFgyYklMqhLWwt4laYwXR/Q==", - "license": "MIT", - "dependencies": { - "aws-ssl-profiles": "^1.1.2", - "denque": "^2.1.0", - "generate-function": "^2.3.1", - "iconv-lite": "^0.7.2", - "long": "^5.3.2", - "lru.min": "^1.1.4", - "named-placeholders": "^1.1.6", - "sql-escaper": "^1.5.1" - }, - "engines": { - "node": ">= 8.0" - }, - "peerDependencies": { - "@types/node": ">= 8" - } - }, - "node_modules/named-placeholders": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.6.tgz", - "integrity": "sha512-Tz09sEL2EEuv5fFowm419c1+a/jSMiBjI9gHxVLrVdbUkkNUUfjsVYs9pVZu5oCon/kmRh9TfLEObFtkVxmY0w==", - "license": "MIT", - "dependencies": { - "lru.min": "^1.1.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/node-gyp-build-optional-packages": { - "version": "5.2.2", - "license": "MIT", - "optional": true, - "dependencies": { - "detect-libc": "^2.0.1" - }, - "bin": { - "node-gyp-build-optional-packages": "bin.js", - "node-gyp-build-optional-packages-optional": "optional.js", - "node-gyp-build-optional-packages-test": "build-test.js" - } - }, - "node_modules/opencode-ework": { - "version": "0.1.0", - "license": "MIT", - "dependencies": { - "@opencode-ai/plugin": "^1.4.3" - } - }, - "node_modules/parse5": { - "version": "8.0.1", - "license": "MIT", - "dependencies": { - "entities": "^8.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/pure-rand": { - "version": "8.4.2", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ], - "license": "MIT" - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/saxes": { - "version": "6.0.0", - "license": "ISC", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=v12.22.7" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sql-escaper": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/sql-escaper/-/sql-escaper-1.5.1.tgz", - "integrity": "sha512-4toX5E1fQbBrpfXidaHnF0669nkAdETeIPTs2SUjxxD7RRIs9ICG4gtpmfc68JCEKehsdwLFqBu9VlQqZ1P1gg==", - "license": "MIT", - "engines": { - "bun": ">=1.0.0", - "deno": ">=2.0.0", - "node": ">=12.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/mysqljs/sql-escaper?sponsor=1" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "license": "MIT" - }, - "node_modules/tldts": { - "version": "7.4.9", - "license": "MIT", - "dependencies": { - "tldts-core": "^7.4.9" - }, - "bin": { - "tldts": "bin/cli.js" - } - }, - "node_modules/tldts-core": { - "version": "7.4.9", - "license": "MIT" - }, - "node_modules/toml": { - "version": "4.3.0", - "license": "MIT", - "engines": { - "node": ">=20" - } - }, - "node_modules/tough-cookie": { - "version": "6.0.2", - "license": "BSD-3-Clause", - "dependencies": { - "tldts": "^7.0.5" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/tr46": { - "version": "6.0.0", - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/typescript": { - "version": "5.9.3", - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici": { - "version": "7.28.0", - "license": "MIT", - "engines": { - "node": ">=20.18.1" - } - }, - "node_modules/undici-types": { - "version": "8.3.0", - "license": "MIT" - }, - "node_modules/uuid": { - "version": "14.0.1", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist-node/bin/uuid" - } - }, - "node_modules/w3c-xmlserializer": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/webidl-conversions": { - "version": "8.0.1", - "license": "BSD-2-Clause", - "engines": { - "node": ">=20" - } - }, - "node_modules/whatwg-mimetype": { - "version": "5.0.0", - "license": "MIT", - "engines": { - "node": ">=20" - } - }, - "node_modules/whatwg-url": { - "version": "16.0.1", - "license": "MIT", - "dependencies": { - "@exodus/bytes": "^1.11.0", - "tr46": "^6.0.0", - "webidl-conversions": "^8.0.1" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/xml-name-validator": { - "version": "5.0.0", - "license": "Apache-2.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "license": "MIT" - }, - "node_modules/yaml": { - "version": "2.9.0", - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" - }, - "funding": { - "url": "https://github.com/sponsors/eemeli" - } - }, - "node_modules/zod": { - "version": "3.25.76", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - } - } -} From 08fa4c45826736ba8e0bdb672263cc87beea0427 Mon Sep 17 00:00:00 2001 From: ranxianglei Date: Mon, 27 Jul 2026 20:35:29 +0800 Subject: [PATCH 2/7] fix(preflight): respect AIO_PACKAGE_ROOT as a true override MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit resolveBundledBin took a dev-repo shortcut (npm root -g) before checking AIO_PACKAGE_ROOT, so the env var was ignored when running from a git checkout. The test 'returns null when AIO_PACKAGE_ROOT points at an empty dir' relied on the override and was silently failing on dev machines + in CI — masked by ci.yml's `continue-on-error: true` on the test step (removed in the CI wiring change). AIO_PACKAGE_ROOT is documented as an override (preflight.ts:10); this makes the implementation match the docs. Explicit env now wins everywhere; the dev-repo fallback only runs when it's unset. Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode) Co-authored-by: Sisyphus --- src/preflight.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/preflight.ts b/src/preflight.ts index 8db821b..fe29033 100644 --- a/src/preflight.ts +++ b/src/preflight.ts @@ -41,6 +41,13 @@ export function resolveCommand(cmd: string): string | null { // the user to "install ework-web first" even though it was already bundled // (B-1). Returns the absolute bin path, or null if not bundled. export function resolveBundledBin(pkgName: string, binRelPath: string): string | null { + // Explicit override wins everywhere (tests + non-standard install prefix). + // Without this, the dev-repo branch below would ignore AIO_PACKAGE_ROOT and + // the "empty dir → null" contract couldn't be exercised from a git checkout. + if (process.env.AIO_PACKAGE_ROOT) { + const candidate = path.join(process.env.AIO_PACKAGE_ROOT, "node_modules", pkgName, binRelPath); + return fs.existsSync(candidate) ? candidate : null; + } if (isDevRepo()) { const r = spawnSync("npm", ["root", "-g"], { encoding: "utf8", stdio: ["ignore", "pipe", "ignore"], env: process.env }); const npmRoot = (r.stdout ?? "").trim(); @@ -50,8 +57,7 @@ export function resolveBundledBin(pkgName: string, binRelPath: string): string | } return null; } - const root = process.env.AIO_PACKAGE_ROOT || DEFAULT_PACKAGE_ROOT; - const candidate = path.join(root, "node_modules", pkgName, binRelPath); + const candidate = path.join(DEFAULT_PACKAGE_ROOT, "node_modules", pkgName, binRelPath); return fs.existsSync(candidate) ? candidate : null; } From 62e2076c866330d8335c02f250f2a861c7585cf2 Mon Sep 17 00:00:00 2001 From: ranxianglei Date: Mon, 27 Jul 2026 20:35:29 +0800 Subject: [PATCH 3/7] ci: make tests authoritative + wire Docker E2E job MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two problems with the old ci.yml: 1. Toothless guards hid failures. `bun test` had `continue-on-error: true` and the CLI smoke had `|| true`, so CI was green-by-design even when tests failed. A unit test (preflight override) had been failing silently — now fixed, and the guard removed so it can't regress unnoticed again. 2. The 996-line Docker E2E (scripts/e2e-install.sh) never ran in CI — it was manual-only despite covering the full install/lifecycle/ migration/multi-daemon paths. Added an `e2e` job that installs opencode from the sst/opencode GitHub release (the runner has none; e2e-install.sh mounts the host binary into the container) and runs e2e-install.sh. Verified passing locally (all 8 phases green). Both jobs run on push + PR to master, in parallel. Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode) Co-authored-by: Sisyphus --- .github/workflows/ci.yml | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 14a1009..54aa011 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,7 +8,7 @@ on: jobs: check: - name: Type-check + install smoke test + name: Type-check + unit tests runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -26,7 +26,33 @@ jobs: - name: Run tests run: bun test - continue-on-error: true - name: Verify CLI entry - run: bun run bin/ework-aio.js --help || true + run: bun run bin/ework-aio.js --help + + e2e: + name: Docker E2E (install + lifecycle + migration) + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - uses: actions/checkout@v4 + + # e2e-install.sh mounts the host's opencode binary into the test + # container (preflight requires it). The runner has none, so install + # from the sst/opencode GitHub release — the same source README points + # users at (https://opencode.ai). + - name: Install opencode + run: | + set -euo pipefail + curl -fsSL https://github.com/sst/opencode/releases/latest/download/opencode-linux-x64.tar.gz -o /tmp/opencode.tgz + mkdir -p /tmp/opencode-extract + tar xzf /tmp/opencode.tgz -C /tmp/opencode-extract + BIN="$(find /tmp/opencode-extract -name opencode -type f | head -1)" + [[ -n "$BIN" ]] || { echo "opencode binary not found in tarball"; ls -R /tmp/opencode-extract; exit 1; } + sudo install "$BIN" /usr/local/bin/opencode + opencode --version + + - name: Run E2E install test + run: ./scripts/e2e-install.sh docker latest + env: + OPENCODE_HOST_BIN: /usr/local/bin/opencode From 471fe070e3a696064912b8749e59f84bed85f411 Mon Sep 17 00:00:00 2001 From: ranxianglei Date: Mon, 27 Jul 2026 21:23:42 +0800 Subject: [PATCH 4/7] test(preflight): make resolveBundledBin discovery deterministic MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The 'finds bundled ework-web' test deleted AIO_PACKAGE_ROOT and relied on the dev-repo fallback (npm root -g), which needs a global ework-aio install. CI has none (only local bun install), so the test returned null and failed — another failure hidden by the old continue-on-error guard. Point AIO_PACKAGE_ROOT at the checkout root instead: node_modules is populated by bun install in both local dev and CI. Deterministic. Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode) Co-authored-by: Sisyphus --- test/preflight.test.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test/preflight.test.ts b/test/preflight.test.ts index 67b9d63..f29fb9c 100644 --- a/test/preflight.test.ts +++ b/test/preflight.test.ts @@ -18,7 +18,10 @@ describe("resolveBundledBin (B-1)", () => { }); test("finds bundled ework-web / ework-daemon from the real package node_modules", () => { - delete process.env.AIO_PACKAGE_ROOT; + // Point at this checkout's node_modules (populated by `bun install`). + // Don't rely on the dev-repo npm-root-g fallback — it needs a global + // ework-aio install that CI doesn't have. + process.env.AIO_PACKAGE_ROOT = path.resolve(import.meta.dir, ".."); const web = resolveBundledBin("ework-web", "bin/ework-web.js"); expect(web).not.toBeNull(); expect(web).toContain("node_modules"); From b77e7623dc26ba38b6b878742bff6af4a1db5bae Mon Sep 17 00:00:00 2001 From: ranxianglei Date: Mon, 27 Jul 2026 21:23:42 +0800 Subject: [PATCH 5/7] =?UTF-8?q?ci(check):=20install=20opencode=20=E2=80=94?= =?UTF-8?q?=20integration=20tests=20need=20it=20on=20PATH?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit install.test.ts runs the real install flow, whose preflight requires opencode (REQUIRED_COMMANDS). The check job had none, so runInstall tests failed with 'Missing required commands on PATH: opencode' — also hidden by the old continue-on-error guard. Install opencode from the sst/opencode release, same as the e2e job. Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode) Co-authored-by: Sisyphus --- .github/workflows/ci.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 54aa011..058dbe6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,6 +21,19 @@ jobs: - name: Install deps run: bun install --frozen-lockfile + # install.test.ts runs the real install flow → preflight requires + # opencode on PATH. The runner has none. + - name: Install opencode + run: | + set -euo pipefail + curl -fsSL https://github.com/sst/opencode/releases/latest/download/opencode-linux-x64.tar.gz -o /tmp/opencode.tgz + mkdir -p /tmp/opencode-extract + tar xzf /tmp/opencode.tgz -C /tmp/opencode-extract + BIN="$(find /tmp/opencode-extract -name opencode -type f | head -1)" + [[ -n "$BIN" ]] || { echo "opencode binary not found in tarball"; ls -R /tmp/opencode-extract; exit 1; } + sudo install "$BIN" /usr/local/bin/opencode + opencode --version + - name: TypeScript type-check run: bun run check From 96c35bb43cc2a3ce5e04f34072a29e308b1cf287 Mon Sep 17 00:00:00 2001 From: ranxianglei Date: Mon, 27 Jul 2026 21:30:14 +0800 Subject: [PATCH 6/7] test(install): drop stub dir from PATH instead of hardcoding paths MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The 'missing ework-web binary' test replaced PATH with a dev-machine- specific string ('/home/dog/.local/bin:...'). CI's setup-bun installs bun elsewhere, so the test failed with 'Missing required commands: bun' instead of the expected 'ework-web not found'. Filter the stub dir out of the real PATH instead — preserves bun/npm/ opencode wherever they live in dev or CI. Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode) Co-authored-by: Sisyphus --- test/install.test.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/test/install.test.ts b/test/install.test.ts index 76f094b..2694968 100644 --- a/test/install.test.ts +++ b/test/install.test.ts @@ -382,7 +382,14 @@ WORK_DAEMON_WEBHOOK_SECRET=somesecret // Keep bun/npm/opencode on PATH (so preflight passes) but drop the // stub dir so resolveCommand("ework-web") returns null. AIO_PACKAGE_ROOT // is pointed at tmpDir in beforeEach, so bundled resolution also fails. - process.env.PATH = `/home/dog/.local/bin:/usr/local/bin:/usr/bin:/bin`; + // Filter the stub dir out of PATH rather than replacing it — bun lives + // at different paths in dev vs CI (setup-bun), so a hardcoded PATH + // breaks one or the other. + const stubSegment = path.join(tmpDir, "stubs"); + process.env.PATH = process.env.PATH + .split(":") + .filter(p => !p.includes(stubSegment)) + .join(":"); await expect(runInstall(opts, silentLogger(), { fetchImpl: makeMockFetch(state) })) .rejects.toThrow(/ework-web not found/); }); From a3eaf9d646a526fd2cafc0f00340b7e1b12af2f6 Mon Sep 17 00:00:00 2001 From: ranxianglei Date: Mon, 27 Jul 2026 21:40:41 +0800 Subject: [PATCH 7/7] fix: correct bin path (bin/ework-aio, not .js) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The CLI entry is bin/ework-aio (a bun shebang script), but ci.yml's 'Verify CLI entry' step and package.json's 'start' script both referenced bin/ework-aio.js — which doesn't exist. The CI step was masked by the old '|| true'. npm run start would also have failed if invoked. All three were buried under the toothless guards removed earlier. Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode) Co-authored-by: Sisyphus --- .github/workflows/ci.yml | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 058dbe6..974892c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -41,7 +41,7 @@ jobs: run: bun test - name: Verify CLI entry - run: bun run bin/ework-aio.js --help + run: bun run bin/ework-aio --help e2e: name: Docker E2E (install + lifecycle + migration) diff --git a/package.json b/package.json index d0433c6..7a283be 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "access": "public" }, "scripts": { - "start": "bun bin/ework-aio.js", + "start": "bun bin/ework-aio", "check": "tsc --noEmit", "test": "bun test", "test:e2e": "bash scripts/e2e-install.sh",