diff --git a/package-lock.json b/package-lock.json index cace66f..246edd7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "mcp-shrimp-task-manager", - "version": "1.0.7", + "version": "1.0.9", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "mcp-shrimp-task-manager", - "version": "1.0.7", + "version": "1.0.9", "license": "MIT", "dependencies": { "@modelcontextprotocol/sdk": "^1.0.0", @@ -21,6 +21,7 @@ "devDependencies": { "@types/node": "^20.8.2", "@types/uuid": "^9.0.6", + "copyfiles": "^2.4.1", "ts-node": "^10.9.2", "typescript": "^5.2.2" } @@ -158,12 +159,45 @@ "node": ">=0.4.0" } }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/body-parser": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", @@ -183,6 +217,17 @@ "node": ">=18" } }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -218,6 +263,45 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, "node_modules/content-disposition": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", @@ -253,6 +337,33 @@ "node": ">=6.6.0" } }, + "node_modules/copyfiles": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-2.4.1.tgz", + "integrity": "sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob": "^7.0.5", + "minimatch": "^3.0.3", + "mkdirp": "^1.0.4", + "noms": "0.0.0", + "through2": "^2.0.1", + "untildify": "^4.0.0", + "yargs": "^16.1.0" + }, + "bin": { + "copyfiles": "copyfiles", + "copyup": "copyfiles" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT" + }, "node_modules/cors": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", @@ -347,6 +458,13 @@ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, "node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", @@ -382,6 +500,16 @@ "node": ">= 0.4" } }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -501,6 +629,13 @@ "node": ">= 0.8" } }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -509,6 +644,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -544,6 +689,28 @@ "node": ">= 0.4" } }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -603,6 +770,18 @@ "node": ">=0.10.0" } }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -616,11 +795,28 @@ "node": ">= 0.10" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/is-promise": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==" }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true, + "license": "MIT" + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -678,6 +874,32 @@ "node": ">= 0.6" } }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -691,6 +913,17 @@ "node": ">= 0.6" } }, + "node_modules/noms": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz", + "integrity": "sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==", + "dev": true, + "license": "ISC", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "~1.0.31" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -737,6 +970,16 @@ "node": ">= 0.8" } }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -761,6 +1004,13 @@ "node": ">=16.20.0" } }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT" + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -809,6 +1059,29 @@ "node": ">= 0.8" } }, + "node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/router": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", @@ -983,6 +1256,92 @@ "node": ">= 0.8" } }, + "node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/through2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/through2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/through2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/through2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -1075,6 +1434,23 @@ "node": ">= 0.8" } }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, "node_modules/uuid": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", @@ -1116,11 +1492,78 @@ "node": ">= 8" } }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", @@ -1260,12 +1703,33 @@ "acorn": "^8.11.0" } }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, "arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, "body-parser": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", @@ -1282,6 +1746,16 @@ "type-is": "^2.0.0" } }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -1305,6 +1779,38 @@ "get-intrinsic": "^1.3.0" } }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, "content-disposition": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", @@ -1328,6 +1834,27 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==" }, + "copyfiles": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-2.4.1.tgz", + "integrity": "sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==", + "dev": true, + "requires": { + "glob": "^7.0.5", + "minimatch": "^3.0.3", + "mkdirp": "^1.0.4", + "noms": "0.0.0", + "through2": "^2.0.1", + "untildify": "^4.0.0", + "yargs": "^16.1.0" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, "cors": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", @@ -1392,6 +1919,12 @@ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, "encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", @@ -1415,6 +1948,12 @@ "es-errors": "^1.3.0" } }, + "escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -1501,11 +2040,23 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==" }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, "function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, "get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -1532,6 +2083,20 @@ "es-object-atoms": "^1.0.0" } }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, "gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -1570,6 +2135,16 @@ "safer-buffer": ">= 2.1.2 < 3.0.0" } }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -1580,11 +2155,23 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, "is-promise": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==" }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -1624,6 +2211,21 @@ "mime-db": "^1.54.0" } }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -1634,6 +2236,16 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==" }, + "noms": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz", + "integrity": "sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "~1.0.31" + } + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -1665,6 +2277,12 @@ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, "path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -1680,6 +2298,12 @@ "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz", "integrity": "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==" }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, "proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -1713,6 +2337,24 @@ "unpipe": "1.0.0" } }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true + }, "router": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", @@ -1831,6 +2473,80 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -1884,6 +2600,18 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" }, + "untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, "uuid": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", @@ -1908,11 +2636,55 @@ "isexe": "^2.0.0" } }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + }, "yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", diff --git a/package.json b/package.json index 19000e4..0094d58 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "mcp-shrimp-task-manager": "./dist/index.js" }, "scripts": { - "build": "tsc && node scripts/add-shebang.js", + "build": "tsc && copyfiles -u 1 './src/**/*.md' dist && node scripts/add-shebang.js", "dev": "ts-node src/index.ts", "start": "node dist/index.js", "test": "echo \"Error: no test specified\" && exit 1" @@ -39,6 +39,7 @@ "devDependencies": { "@types/node": "^20.8.2", "@types/uuid": "^9.0.6", + "copyfiles": "^2.4.1", "ts-node": "^10.9.2", "typescript": "^5.2.2" } diff --git a/src/prompts/generators/analyzeTask.ts b/src/prompts/generators/analyzeTask.ts index bd5ad87..5fe2007 100644 --- a/src/prompts/generators/analyzeTask.ts +++ b/src/prompts/generators/analyzeTask.ts @@ -3,8 +3,11 @@ * 負責將模板和參數組合成最終的 prompt */ -import { loadPrompt, generatePrompt } from "../loader.js"; -import * as templates from "../templates/analyzeTask.js"; +import { + loadPrompt, + generatePrompt, + loadPromptFromTemplate, +} from "../loader.js"; /** * analyzeTask prompt 參數介面 @@ -21,25 +24,23 @@ export interface AnalyzeTaskPromptParams { * @returns 生成的 prompt */ export function getAnalyzeTaskPrompt(params: AnalyzeTaskPromptParams): string { - // 開始構建基本 prompt - let basePrompt = generatePrompt(templates.analyzeTaskTemplate, { - summary: params.summary, - initialConcept: params.initialConcept, - }); + const indexTemplate = loadPromptFromTemplate("analyzeTask/index.md"); - // 添加技術審核要點 - basePrompt += templates.technicalReviewTemplate; + const iterationTemplate = loadPromptFromTemplate("analyzeTask/iteration.md"); - // 如果有前次分析結果,添加相關模板 + let iterationPrompt = ""; if (params.previousAnalysis) { - basePrompt += generatePrompt(templates.iterationAnalysisTemplate, { + iterationPrompt = generatePrompt(iterationTemplate, { previousAnalysis: params.previousAnalysis, }); } - // 添加下一步行動指導 - basePrompt += templates.nextActionTemplate; + let prompt = generatePrompt(indexTemplate, { + summary: params.summary, + initialConcept: params.initialConcept, + iterationPrompt: iterationPrompt, + }); // 載入可能的自定義 prompt - return loadPrompt(basePrompt, "ANALYZE_TASK"); + return loadPrompt(prompt, "ANALYZE_TASK"); } diff --git a/src/prompts/generators/completeTask.ts b/src/prompts/generators/completeTask.ts index e514830..5902014 100644 --- a/src/prompts/generators/completeTask.ts +++ b/src/prompts/generators/completeTask.ts @@ -3,8 +3,11 @@ * 負責將模板和參數組合成最終的 prompt */ -import { loadPrompt, generatePrompt } from "../loader.js"; -import * as templates from "../templates/completeTask.js"; +import { + loadPrompt, + generatePrompt, + loadPromptFromTemplate, +} from "../loader.js"; import { Task } from "../../types/index.js"; /** @@ -25,22 +28,15 @@ export function getCompleteTaskPrompt( ): string { const { task, completionTime } = params; + const indexTemplate = loadPromptFromTemplate("completeTask/index.md"); + // 開始構建基本 prompt - let basePrompt = generatePrompt(templates.completeTaskConfirmationTemplate, { + let prompt = generatePrompt(indexTemplate, { name: task.name, id: task.id, completionTime: completionTime, }); - // 添加任務摘要要求 - basePrompt += templates.taskSummaryRequirementsTemplate; - - // 添加重要提示 - basePrompt += templates.importantReminderTemplate; - - // 添加連續執行模式提示 - basePrompt += templates.continuousModeReminderTemplate; - // 載入可能的自定義 prompt - return loadPrompt(basePrompt, "COMPLETE_TASK"); + return loadPrompt(prompt, "COMPLETE_TASK"); } diff --git a/src/prompts/generators/executeTask.ts b/src/prompts/generators/executeTask.ts index 80e33fe..92eb8be 100644 --- a/src/prompts/generators/executeTask.ts +++ b/src/prompts/generators/executeTask.ts @@ -3,21 +3,13 @@ * 負責將模板和參數組合成最終的 prompt */ -import { loadPrompt, generatePrompt } from "../loader.js"; -import * as templates from "../templates/executeTask.js"; +import { + loadPrompt, + generatePrompt, + loadPromptFromTemplate, +} from "../loader.js"; import { Task, TaskStatus } from "../../types/index.js"; -/** - * 任務複雜度級別的介面 - */ -interface TaskComplexityLevel { - VERY_HIGH: string; - HIGH: string; - MEDIUM: string; - LOW: string; - VERY_LOW: string; -} - /** * 任務複雜度評估的介面 */ @@ -38,7 +30,6 @@ export interface ExecuteTaskPromptParams { complexityAssessment?: ComplexityAssessment; relatedFilesSummary?: string; dependencyTasks?: Task[]; - potentialFiles?: string[]; } /** @@ -65,143 +56,115 @@ function getComplexityStyle(level: string): string { * @returns 生成的 prompt */ export function getExecuteTaskPrompt(params: ExecuteTaskPromptParams): string { - const { - task, - complexityAssessment, - relatedFilesSummary, - dependencyTasks, - potentialFiles, - } = params; + const { task, complexityAssessment, relatedFilesSummary, dependencyTasks } = + params; - // 處理注意事項 - const notes = task.notes ? `**注意事項:** ${task.notes}\n` : ""; + const notesTemplate = loadPromptFromTemplate("executeTask/notes.md"); + let notesPrompt = ""; + if (task.notes) { + notesPrompt = generatePrompt(notesTemplate, { + notes: task.notes, + }); + } - // 開始構建基本 prompt - let basePrompt = generatePrompt(templates.executeTaskTemplate, { - name: task.name, - id: task.id, - description: task.description, - notes: notes, - }); - - // 添加實現指南(如果有) + const implementationGuideTemplate = loadPromptFromTemplate( + "executeTask/implementationGuide.md" + ); + let implementationGuidePrompt = ""; if (task.implementationGuide) { - basePrompt += generatePrompt(templates.implementationGuideTemplate, { + implementationGuidePrompt = generatePrompt(implementationGuideTemplate, { implementationGuide: task.implementationGuide, }); } - // 添加驗證標準(如果有) + const verificationCriteriaTemplate = loadPromptFromTemplate( + "executeTask/verificationCriteria.md" + ); + let verificationCriteriaPrompt = ""; if (task.verificationCriteria) { - basePrompt += generatePrompt(templates.verificationCriteriaTemplate, { + verificationCriteriaPrompt = generatePrompt(verificationCriteriaTemplate, { verificationCriteria: task.verificationCriteria, }); } - // 添加分析結果(如果有) + const analysisResultTemplate = loadPromptFromTemplate( + "executeTask/analysisResult.md" + ); + let analysisResultPrompt = ""; if (task.analysisResult) { - basePrompt += generatePrompt(templates.analysisResultTemplate, { + analysisResultPrompt = generatePrompt(analysisResultTemplate, { analysisResult: task.analysisResult, }); } - // 添加依賴任務完成摘要(如果有) + const dependencyTasksTemplate = loadPromptFromTemplate( + "executeTask/dependencyTasks.md" + ); + let dependencyTasksPrompt = ""; if (dependencyTasks && dependencyTasks.length > 0) { const completedDependencyTasks = dependencyTasks.filter( (t) => t.status === TaskStatus.COMPLETED && t.summary ); if (completedDependencyTasks.length > 0) { - basePrompt += templates.dependencyTaskSummaryTemplate; - + let dependencyTasksContent = ""; for (const depTask of completedDependencyTasks) { - basePrompt += generatePrompt(templates.dependencyTaskItemTemplate, { - name: depTask.name, - summary: depTask.summary || "*無完成摘要*", - }); + dependencyTasksContent += `### ${depTask.name}\n${ + depTask.summary || "*無完成摘要*" + }\n\n`; } - } - } - - // 添加相關文件(如果有) - if (relatedFilesSummary) { - basePrompt += generatePrompt(templates.relatedFilesSummaryTemplate, { - relatedFilesSummary: relatedFilesSummary, - }); - } else { - // 無相關文件 - basePrompt += templates.noRelatedFilesTemplate; - - // 添加潛在相關文件建議(如果有) - if (potentialFiles && potentialFiles.length > 0) { - const potentialFilesStr = potentialFiles - .map((file) => `- 含有 "${file}" 的文件\n`) - .join(""); - - basePrompt += generatePrompt(templates.recommendedFilesTemplate, { - potentialFiles: potentialFilesStr, + dependencyTasksPrompt = generatePrompt(dependencyTasksTemplate, { + dependencyTasks: dependencyTasksContent, }); } } - // 添加複雜度評估(如果有) + const relatedFilesSummaryTemplate = loadPromptFromTemplate( + "executeTask/relatedFilesSummary.md" + ); + let relatedFilesSummaryPrompt = ""; + relatedFilesSummaryPrompt = generatePrompt(relatedFilesSummaryTemplate, { + relatedFilesSummary: relatedFilesSummary || "當前任務沒有關聯的文件。", + }); + + const complexityTemplate = loadPromptFromTemplate( + "executeTask/complexity.md" + ); + let complexityPrompt = ""; if (complexityAssessment) { - basePrompt += generatePrompt(templates.complexityAssessmentTemplate, { - level: complexityAssessment.level, - }); - - // 添加複雜度警告樣式(如果需要) const complexityStyle = getComplexityStyle(complexityAssessment.level); - if (complexityStyle) { - basePrompt += generatePrompt(templates.complexityWarningTemplate, { - complexityStyle: complexityStyle, - }); - } - - // 添加評估指標 - basePrompt += templates.assessmentMetricsTemplate; - basePrompt += generatePrompt(templates.descriptionLengthMetric, { - descriptionLength: complexityAssessment.metrics.descriptionLength, - }); - basePrompt += generatePrompt(templates.dependenciesCountMetric, { - dependenciesCount: complexityAssessment.metrics.dependenciesCount, - }); - - // 添加處理建議(如果有) + let recommendationContent = ""; if ( complexityAssessment.recommendations && complexityAssessment.recommendations.length > 0 ) { - basePrompt += templates.handlingRecommendationsTemplate; - if (complexityAssessment.recommendations[0]) { - basePrompt += generatePrompt(templates.handlingRecommendation1, { - recommendation1: complexityAssessment.recommendations[0], - }); - } - if (complexityAssessment.recommendations[1]) { - basePrompt += generatePrompt(templates.handlingRecommendation2, { - recommendation2: complexityAssessment.recommendations[1], - }); + for (const recommendation of complexityAssessment.recommendations) { + recommendationContent += `- ${recommendation}\n`; } } + complexityPrompt = generatePrompt(complexityTemplate, { + level: complexityAssessment.level, + complexityStyle: complexityStyle, + descriptionLength: complexityAssessment.metrics.descriptionLength, + dependenciesCount: complexityAssessment.metrics.dependenciesCount, + recommendation: recommendationContent, + }); } - // 添加執行步驟 - basePrompt += templates.executionStepsTemplate; - basePrompt += templates.executionStep1; - basePrompt += templates.executionStep2; - basePrompt += templates.executionStep3; - basePrompt += templates.executionStep4; - - // 添加質量要求 - basePrompt += templates.qualityRequirementsTemplate; - basePrompt += templates.qualityRequirement1; - basePrompt += templates.qualityRequirement2; - basePrompt += templates.qualityRequirement3; - - // 添加完成提示 - basePrompt += templates.completionReminderTemplate; + const indexTemplate = loadPromptFromTemplate("executeTask/index.md"); + let prompt = generatePrompt(indexTemplate, { + name: task.name, + id: task.id, + description: task.description, + notesTemplate: notesPrompt, + implementationGuideTemplate: implementationGuidePrompt, + verificationCriteriaTemplate: verificationCriteriaPrompt, + analysisResultTemplate: analysisResultPrompt, + dependencyTasksTemplate: dependencyTasksPrompt, + relatedFilesSummaryTemplate: relatedFilesSummaryPrompt, + complexityTemplate: complexityPrompt, + }); // 載入可能的自定義 prompt - return loadPrompt(basePrompt, "EXECUTE_TASK"); + return loadPrompt(prompt, "EXECUTE_TASK"); } diff --git a/src/prompts/generators/getTaskDetail.ts b/src/prompts/generators/getTaskDetail.ts index 38a2fb2..90e19f5 100644 --- a/src/prompts/generators/getTaskDetail.ts +++ b/src/prompts/generators/getTaskDetail.ts @@ -3,9 +3,12 @@ * 負責將模板和參數組合成最終的 prompt */ -import { loadPrompt, generatePrompt } from "../loader.js"; -import * as templates from "../templates/getTaskDetail.js"; -import { Task, RelatedFile } from "../../types/index.js"; +import { + loadPrompt, + generatePrompt, + loadPromptFromTemplate, +} from "../loader.js"; +import { Task } from "../../types/index.js"; /** * getTaskDetail prompt 參數介面 @@ -28,96 +31,108 @@ export function getGetTaskDetailPrompt( // 如果有錯誤,顯示錯誤訊息 if (error) { - return generatePrompt(templates.errorTemplate, { + const errorTemplate = loadPromptFromTemplate("getTaskDetail/error.md"); + return generatePrompt(errorTemplate, { errorMessage: error, }); } // 如果找不到任務,顯示找不到任務的訊息 if (!task) { - return generatePrompt(templates.taskNotFoundTemplate, { + const notFoundTemplate = loadPromptFromTemplate( + "getTaskDetail/notFound.md" + ); + return generatePrompt(notFoundTemplate, { taskId, }); } - // 開始構建基本 prompt - let basePrompt = templates.taskDetailTitleTemplate; - - // 添加任務基本信息 - basePrompt += generatePrompt(templates.taskBasicInfoTemplate, { - name: task.name, - id: task.id, - status: task.status, - description: task.description, - }); - - // 添加注記(如果有) + let notesPrompt = ""; if (task.notes) { - basePrompt += generatePrompt(templates.taskNotesTemplate, { + const notesTemplate = loadPromptFromTemplate("getTaskDetail/notes.md"); + notesPrompt = generatePrompt(notesTemplate, { notes: task.notes, }); } - // 添加依賴任務(如果有) + let dependenciesPrompt = ""; if (task.dependencies && task.dependencies.length > 0) { - basePrompt += generatePrompt(templates.taskDependenciesTemplate, { + const dependenciesTemplate = loadPromptFromTemplate( + "getTaskDetail/dependencies.md" + ); + dependenciesPrompt = generatePrompt(dependenciesTemplate, { dependencies: task.dependencies .map((dep) => `\`${dep.taskId}\``) .join(", "), }); } - // 添加實現指南(如果有) + let implementationGuidePrompt = ""; if (task.implementationGuide) { - basePrompt += generatePrompt(templates.taskImplementationGuideTemplate, { + const implementationGuideTemplate = loadPromptFromTemplate( + "getTaskDetail/implementationGuide.md" + ); + implementationGuidePrompt = generatePrompt(implementationGuideTemplate, { implementationGuide: task.implementationGuide, }); } - // 添加驗證標準(如果有) + let verificationCriteriaPrompt = ""; if (task.verificationCriteria) { - basePrompt += generatePrompt(templates.taskVerificationCriteriaTemplate, { + const verificationCriteriaTemplate = loadPromptFromTemplate( + "getTaskDetail/verificationCriteria.md" + ); + verificationCriteriaPrompt = generatePrompt(verificationCriteriaTemplate, { verificationCriteria: task.verificationCriteria, }); } - // 添加相關文件(如果有) + let relatedFilesPrompt = ""; if (task.relatedFiles && task.relatedFiles.length > 0) { - const fileItems = task.relatedFiles - .map((file) => - generatePrompt(templates.taskRelatedFileItemTemplate, { - path: file.path, - type: file.type, - description: file.description ? `: ${file.description}` : "", - }) - ) - .join("\n"); - - basePrompt += generatePrompt(templates.taskRelatedFilesTemplate, { - files: fileItems, + const relatedFilesTemplate = loadPromptFromTemplate( + "getTaskDetail/relatedFiles.md" + ); + relatedFilesPrompt = generatePrompt(relatedFilesTemplate, { + files: task.relatedFiles + .map( + (file) => + `- \`${file.path}\` (${file.type})${ + file.description ? `: ${file.description}` : "" + }` + ) + .join("\n"), }); } - // 添加時間信息 - basePrompt += generatePrompt(templates.taskTimeInfoTemplate, { + let complatedSummaryPrompt = ""; + if (task.completedAt) { + const complatedSummaryTemplate = loadPromptFromTemplate( + "getTaskDetail/complatedSummary.md" + ); + complatedSummaryPrompt = generatePrompt(complatedSummaryTemplate, { + completedTime: new Date(task.completedAt).toLocaleString("zh-TW"), + summary: task.summary || "*無完成摘要*", + }); + } + + const indexTemplate = loadPromptFromTemplate("getTaskDetail/index.md"); + + // 開始構建基本 prompt + let prompt = generatePrompt(indexTemplate, { + name: task.name, + id: task.id, + status: task.status, + description: task.description, + notesTemplate: notesPrompt, + dependenciesTemplate: dependenciesPrompt, + implementationGuideTemplate: implementationGuidePrompt, + verificationCriteriaTemplate: verificationCriteriaPrompt, + relatedFilesTemplate: relatedFilesPrompt, createdTime: new Date(task.createdAt).toLocaleString("zh-TW"), updatedTime: new Date(task.updatedAt).toLocaleString("zh-TW"), + complatedSummaryTemplate: complatedSummaryPrompt, }); - // 添加完成時間(如果有) - if (task.completedAt) { - basePrompt += generatePrompt(templates.taskCompletedTimeTemplate, { - completedTime: new Date(task.completedAt).toLocaleString("zh-TW"), - }); - } - - // 添加完成摘要(如果有) - if (task.summary) { - basePrompt += generatePrompt(templates.taskSummaryTemplate, { - summary: task.summary, - }); - } - // 載入可能的自定義 prompt - return loadPrompt(basePrompt, "GET_TASK_DETAIL"); + return loadPrompt(prompt, "GET_TASK_DETAIL"); } diff --git a/src/prompts/generators/initProjectRules.ts b/src/prompts/generators/initProjectRules.ts index 35b79af..df31b3f 100644 --- a/src/prompts/generators/initProjectRules.ts +++ b/src/prompts/generators/initProjectRules.ts @@ -3,8 +3,11 @@ * 負責將模板和參數組合成最終的 prompt */ -import { loadPrompt, generatePrompt } from "../loader.js"; -import { initProjectRulesTemplate } from "../templates/initProjectRules.js"; +import { + loadPrompt, + generatePrompt, + loadPromptFromTemplate, +} from "../loader.js"; import { getRulesFilePath } from "../../utils/pathUtils.js"; /** * initProjectRules prompt 參數介面 @@ -23,7 +26,8 @@ export function getInitProjectRulesPrompt( ): string { // 使用基本模板 const rulesPath = getRulesFilePath(); - const basePrompt = generatePrompt(initProjectRulesTemplate, { + const indexTemplate = loadPromptFromTemplate("initProjectRules/index.md"); + const basePrompt = generatePrompt(indexTemplate, { rulesPath, }); diff --git a/src/prompts/generators/listTasks.ts b/src/prompts/generators/listTasks.ts index f7a5851..ec2c9a0 100644 --- a/src/prompts/generators/listTasks.ts +++ b/src/prompts/generators/listTasks.ts @@ -3,8 +3,11 @@ * 負責將模板和參數組合成最終的 prompt */ -import { loadPrompt, generatePrompt } from "../loader.js"; -import * as templates from "../templates/listTasks.js"; +import { + loadPrompt, + generatePrompt, + loadPromptFromTemplate, +} from "../loader.js"; import { Task, TaskStatus } from "../../types/index.js"; /** @@ -26,31 +29,21 @@ export function getListTasksPrompt(params: ListTasksPromptParams): string { // 如果沒有任務,顯示通知 if (allTasks.length === 0) { + const notFoundTemplate = loadPromptFromTemplate("listTasks/notFound.md"); const statusText = status === "all" ? "任何" : `任何 ${status} 的`; - return generatePrompt(templates.noTasksNoticeTemplate, { + return generatePrompt(notFoundTemplate, { statusText: statusText, }); } - // 開始構建基本 prompt - let basePrompt = templates.dashboardTitleTemplate; - - // 添加狀態概覽 - basePrompt += templates.statusOverviewTitleTemplate; - // 獲取所有狀態的計數 const statusCounts = Object.values(TaskStatus) .map((statusType) => { const count = tasks[statusType]?.length || 0; - return generatePrompt(templates.statusCountTemplate, { - status: statusType, - count: count, - }); + return `- **${statusType}**: ${count} 個任務`; }) .join("\n"); - basePrompt += `${statusCounts}\n\n`; - let filterStatus = "all"; switch (status) { case "pending": @@ -64,58 +57,43 @@ export function getListTasksPrompt(params: ListTasksPromptParams): string { break; } + let taskDetails = ""; + let taskDetailsTemplate = loadPromptFromTemplate("listTasks/taskDetails.md"); // 添加每個狀態下的詳細任務 for (const statusType of Object.values(TaskStatus)) { const tasksWithStatus = tasks[statusType] || []; - if ( tasksWithStatus.length > 0 && (filterStatus === "all" || filterStatus === statusType) ) { - basePrompt += generatePrompt(templates.statusSectionTitleTemplate, { - status: statusType, - count: tasksWithStatus.length, - }); - for (const task of tasksWithStatus) { - basePrompt += formatTaskDetails(task); + let dependencies = "沒有依賴"; + if (task.dependencies && task.dependencies.length > 0) { + dependencies = task.dependencies + .map((d) => `\`${d.taskId}\``) + .join(", "); + } + taskDetails += generatePrompt(taskDetailsTemplate, { + name: task.name, + id: task.id, + description: task.description, + createAt: task.createdAt, + complatedSummary: + (task.summary || "").substring(0, 100) + + ((task.summary || "").length > 100 ? "..." : ""), + dependencies: dependencies, + complatedAt: task.completedAt, + }); } } } + const indexTemplate = loadPromptFromTemplate("listTasks/index.md"); + let prompt = generatePrompt(indexTemplate, { + statusCount: statusCounts, + taskDetailsTemplate: taskDetails, + }); + // 載入可能的自定義 prompt - return loadPrompt(basePrompt, "LIST_TASKS"); -} - -/** - * 格式化任務詳情 - * @param task 任務 - * @returns 格式化後的任務詳情字串 - */ -function formatTaskDetails(task: Task): string { - // 此函數內容應來自原始的 formatTaskDetails 函數 - // 根據實際需求實現詳細的任務格式化邏輯 - let result = `### ${task.name}\n**ID:** \`${task.id}\`\n**描述:** ${task.description}\n`; - - if (task.status === TaskStatus.COMPLETED && task.summary) { - result += `**完成摘要:** ${task.summary.substring(0, 100)}${ - task.summary.length > 100 ? "..." : "" - }\n`; - } - - if (task.dependencies && task.dependencies.length > 0) { - result += `**依賴:** ${task.dependencies - .map((d) => `\`${d.taskId}\``) - .join(", ")}\n`; - } - - result += `**創建時間:** ${new Date(task.createdAt).toLocaleString()}\n`; - - if (task.status === TaskStatus.COMPLETED && task.completedAt) { - result += `**完成時間:** ${new Date(task.completedAt).toLocaleString()}\n`; - } - - result += "\n"; - - return result; + return loadPrompt(prompt, "LIST_TASKS"); } diff --git a/src/prompts/generators/planTask.ts b/src/prompts/generators/planTask.ts index 4f433c9..3bc5764 100644 --- a/src/prompts/generators/planTask.ts +++ b/src/prompts/generators/planTask.ts @@ -3,8 +3,11 @@ * 負責將模板和參數組合成最終的 prompt */ -import { loadPrompt, generatePrompt } from "../loader.js"; -import * as templates from "../templates/planTask.js"; +import { + loadPrompt, + generatePrompt, + loadPromptFromTemplate, +} from "../loader.js"; import { getRulesFilePath } from "../../utils/pathUtils.js"; import { Task, TaskDependency } from "../../types/index.js"; @@ -26,34 +29,20 @@ export interface PlanTaskPromptParams { * @returns 生成的 prompt */ export function getPlanTaskPrompt(params: PlanTaskPromptParams): string { - // 開始構建基本 prompt - let basePrompt = generatePrompt(templates.planTaskTemplate, { - description: params.description, - }); - - // 如果有 requirements,添加到 prompt 中 - if (params.requirements) { - basePrompt += generatePrompt(templates.requirementsTemplate, { - requirements: params.requirements, - }); - } - - // 如果需要參考現有任務 + let tasksContent = ""; if ( params.existingTasksReference && params.completedTasks && params.pendingTasks ) { const allTasks = [...params.completedTasks, ...params.pendingTasks]; - // 如果存在任務,則添加相關資訊 if (allTasks.length > 0) { - basePrompt += templates.existingTasksReferenceTemplate; + let completeTasksContent = "no completed tasks"; // 處理已完成任務 if (params.completedTasks.length > 0) { - basePrompt += templates.completedTasksTitleTemplate; - + completeTasksContent = ""; // 最多顯示10個已完成任務,避免提示詞過長 const tasksToShow = params.completedTasks.length > 10 @@ -63,140 +52,81 @@ export function getPlanTaskPrompt(params: PlanTaskPromptParams): string { tasksToShow.forEach((task, index) => { // 產生完成時間資訊 (如果有) const completedTimeText = task.completedAt - ? ` - 完成時間:${task.completedAt.toLocaleString()}\n` + ? ` - completedAt:${task.completedAt.toLocaleString()}\n` : ""; - // 使用模板生成任務顯示項目 - basePrompt += generatePrompt(templates.completedTaskItemTemplate, { - index: index + 1, - taskName: task.name, - taskId: task.id, - taskDescription: - task.description.length > 100 - ? task.description.substring(0, 100) + "..." - : task.description, - completedTime: completedTimeText, - }); - + completeTasksContent += `{index}. **${task.name}** (ID: \`${ + task.id + }\`)\n - description:${ + task.description.length > 100 + ? task.description.substring(0, 100) + "..." + : task.description + }\n${completedTimeText}`; // 如果不是最後一個任務,添加換行 if (index < tasksToShow.length - 1) { - basePrompt += "\n\n"; + completeTasksContent += "\n\n"; } }); // 如果有更多任務,顯示提示 if (params.completedTasks.length > 10) { - basePrompt += `\n\n*(僅顯示前10個,共 ${params.completedTasks.length} 個)*\n`; + completeTasksContent += `\n\n*(僅顯示前10個,共 ${params.completedTasks.length} 個)*\n`; } } + let unfinishedTasksContent = "no pending tasks"; // 處理未完成任務 if (params.pendingTasks && params.pendingTasks.length > 0) { - basePrompt += templates.pendingTasksTitleTemplate; + unfinishedTasksContent = ""; params.pendingTasks.forEach((task, index) => { - // 處理依賴關係 (如果有) const dependenciesText = task.dependencies && task.dependencies.length > 0 - ? ` - 依賴:${task.dependencies + ? ` - dependence:${task.dependencies .map((dep: TaskDependency) => `\`${dep.taskId}\``) .join(", ")}\n` : ""; - // 使用模板生成未完成任務顯示項目 - basePrompt += generatePrompt(templates.pendingTaskItemTemplate, { - index: index + 1, - taskName: task.name, - taskId: task.id, - taskDescription: - task.description.length > 150 - ? task.description.substring(0, 150) + "..." - : task.description, - taskStatus: task.status, - dependencies: dependenciesText, - }); + unfinishedTasksContent += `${index + 1}. **${task.name}** (ID: \`${ + task.id + }\`)\n - description:${ + task.description.length > 150 + ? task.description.substring(0, 150) + "..." + : task.description + }\n - status:${task.status}\n${dependenciesText}`; // 如果不是最後一個任務,添加換行 if (index < (params.pendingTasks?.length ?? 0) - 1) { - basePrompt += "\n\n"; + unfinishedTasksContent += "\n\n"; } }); } - // 添加任務調整原則 - basePrompt += templates.taskAdjustmentPrinciplesTemplate; - basePrompt += templates.taskAdjustmentPrinciplesContent; - basePrompt += templates.taskAdjustmentPrinciplesContent2; - basePrompt += templates.taskAdjustmentPrinciplesContent3; - basePrompt += templates.taskAdjustmentPrinciplesContent4; - basePrompt += templates.taskAdjustmentPrinciplesContent5; - - // 添加任務更新模式指導 - basePrompt += templates.taskUpdateModesTemplate; - basePrompt += templates.taskUpdateModesContent1; - basePrompt += templates.taskUpdateModesContent1Detail; - basePrompt += templates.taskUpdateModesContent1Usage; - basePrompt += templates.taskUpdateModesContent2; - basePrompt += templates.taskUpdateModesContent2Detail; - basePrompt += templates.taskUpdateModesContent2Usage; - basePrompt += templates.taskUpdateModesContent3; - basePrompt += templates.taskUpdateModesContent3Detail; - basePrompt += templates.taskUpdateModesContent3Usage; - basePrompt += templates.taskUpdateModesContent3Mechanism; + const tasksTemplate = loadPromptFromTemplate("planTask/tasks.md"); + tasksContent = generatePrompt(tasksTemplate, { + completedTasks: completeTasksContent, + unfinishedTasks: unfinishedTasksContent, + }); } } - // 添加分析指引 - basePrompt += templates.analysisGuideTemplate; - - // 添加任務記憶檢索相關模板 - basePrompt += templates.memoryDirTemplate; - basePrompt += generatePrompt(templates.memoryDirContent, { - memoryDir: params.memoryDir, - }); - basePrompt += templates.memoryDirUsageGuide; - - // 添加查詢建議 - basePrompt += templates.queryRecommendationsTemplate; - basePrompt += templates.queryHighPriority; - basePrompt += templates.queryHighPriorityItems; - basePrompt += templates.queryHighPriorityItems2; - basePrompt += templates.queryHighPriorityItems3; - basePrompt += templates.queryHighPriorityItems4; - basePrompt += templates.queryMediumPriority; - basePrompt += templates.queryMediumPriorityItems; - basePrompt += templates.queryMediumPriorityItems2; - basePrompt += templates.queryMediumPriorityItems3; - basePrompt += templates.queryLowPriority; - basePrompt += templates.queryLowPriorityItems; - basePrompt += templates.queryLowPriorityItems2; - basePrompt += templates.queryLowPriorityItems3; - basePrompt += templates.queryReminder; - - // 添加資訊收集指南 - basePrompt += templates.infoCollectionGuideTemplate; - basePrompt += templates.infoCollectionGuideItems; - basePrompt += templates.infoCollectionGuideItems2; - basePrompt += templates.infoCollectionGuideItems3; - - const rulesPath = getRulesFilePath(); - // 添加下一步指導 - basePrompt += generatePrompt(templates.nextStepsTemplate, { - rulesPath, - }); - basePrompt += templates.nextStepsContent1; - basePrompt += templates.nextStepsContent1Detail; - + let thoughtTemplate = ""; if (process.env.ENABLE_THOUGHT_CHAIN !== "false") { - basePrompt += templates.nextStepsThoughtTemplate; - basePrompt += templates.nextStepsThoughtDetail1; - basePrompt += templates.nextStepsThoughtDetail2; + thoughtTemplate = loadPromptFromTemplate("planTask/hasThought.md"); } else { - basePrompt += templates.nextStepsContent2; - basePrompt += templates.nextStepsContent2Detail1; - basePrompt += templates.nextStepsContent2Detail2; + thoughtTemplate = loadPromptFromTemplate("planTask/noThought.md"); } + const rulesPath = getRulesFilePath(); + const indexTemplate = loadPromptFromTemplate("planTask/index.md"); + let prompt = generatePrompt(indexTemplate, { + description: params.description, + requirements: params.requirements || "No requirements", + tasksTemplate: tasksContent, + rulesPath: rulesPath, + memoryDir: params.memoryDir, + thoughtTemplate: thoughtTemplate, + }); // 載入可能的自定義 prompt - return loadPrompt(basePrompt, "PLAN_TASK"); + return loadPrompt(prompt, "PLAN_TASK"); } diff --git a/src/prompts/generators/queryTask.ts b/src/prompts/generators/queryTask.ts index 88c391a..f6f6905 100644 --- a/src/prompts/generators/queryTask.ts +++ b/src/prompts/generators/queryTask.ts @@ -3,8 +3,11 @@ * 負責將模板和參數組合成最終的 prompt */ -import { loadPrompt, generatePrompt } from "../loader.js"; -import * as templates from "../templates/queryTask.js"; +import { + loadPrompt, + generatePrompt, + loadPromptFromTemplate, +} from "../loader.js"; import { Task } from "../../types/index.js"; /** @@ -28,69 +31,40 @@ export interface QueryTaskPromptParams { export function getQueryTaskPrompt(params: QueryTaskPromptParams): string { const { query, isId, tasks, totalTasks, page, pageSize, totalPages } = params; - // 初始化基本 prompt - let basePrompt = generatePrompt(templates.searchHeaderTemplate, { - query, - searchMode: isId - ? templates.searchModeIdTemplate - : templates.searchModeKeywordTemplate, - totalTasks, - }); - - // 如果沒有找到任務 if (tasks.length === 0) { - basePrompt += generatePrompt( - isId ? templates.noResultsIdTemplate : templates.noResultsKeywordTemplate, - { query } - ); - return loadPrompt(basePrompt, "QUERY_TASK"); - } - - // 添加任務列表 - basePrompt += templates.resultListHeaderTemplate; - - // 格式化找到的任務 - for (const task of tasks) { - basePrompt += formatTaskSummary(task); - } - - // 添加分頁信息 - if (totalPages > 1) { - basePrompt += generatePrompt(templates.paginationInfoTemplate, { - page, - totalPages, - pageSize, - totalTasks, + const notFoundTemplate = loadPromptFromTemplate("queryTask/notFound.md"); + return generatePrompt(notFoundTemplate, { + query, }); } - // 添加使用提示 - basePrompt += templates.usageHintTemplate; + const taskDetailsTemplate = loadPromptFromTemplate( + "queryTask/taskDetails.md" + ); + let tasksContent = ""; + for (const task of tasks) { + tasksContent += generatePrompt(taskDetailsTemplate, { + taskId: task.id, + taskName: task.name, + taskStatus: task.status, + taskDescription: + task.description.length > 100 + ? `${task.description.substring(0, 100)}...` + : task.description, + createdAt: new Date(task.createdAt).toLocaleString(), + }); + } - // 載入可能的自定義 prompt - return loadPrompt(basePrompt, "QUERY_TASK"); -} - -/** - * 格式化任務摘要 - * @param task 任務對象 - * @returns 格式化後的任務摘要字串 - */ -function formatTaskSummary(task: Task): string { - // 簡化版的任務摘要,比完整格式更精簡 - let result = generatePrompt(templates.taskSummaryTemplate, { - taskId: task.id, - taskName: task.name, - taskStatus: task.status, - taskDescription: - task.description.length > 100 - ? `${task.description.substring(0, 100)}...` - : task.description, - createdAt: new Date(task.createdAt).toLocaleString(), - completedAt: task.completedAt - ? new Date(task.completedAt).toLocaleString() - : "尚未完成", + const indexTemplate = loadPromptFromTemplate("queryTask/index.md"); + const prompt = generatePrompt(indexTemplate, { + tasksContent, + page, + totalPages, + pageSize, + totalTasks, + query, }); - return result; + // 載入可能的自定義 prompt + return loadPrompt(prompt, "QUERY_TASK"); } diff --git a/src/prompts/generators/reflectTask.ts b/src/prompts/generators/reflectTask.ts index edde514..b1005a2 100644 --- a/src/prompts/generators/reflectTask.ts +++ b/src/prompts/generators/reflectTask.ts @@ -3,8 +3,11 @@ * 負責將模板和參數組合成最終的 prompt */ -import { loadPrompt, generatePrompt } from "../loader.js"; -import * as templates from "../templates/reflectTask.js"; +import { + loadPrompt, + generatePrompt, + loadPromptFromTemplate, +} from "../loader.js"; /** * reflectTask prompt 參數介面 @@ -20,30 +23,12 @@ export interface ReflectTaskPromptParams { * @returns 生成的 prompt */ export function getReflectTaskPrompt(params: ReflectTaskPromptParams): string { - // 開始構建基本 prompt - let basePrompt = generatePrompt(templates.reflectTaskTemplate, { + const indexTemplate = loadPromptFromTemplate("reflectTask/index.md"); + const prompt = generatePrompt(indexTemplate, { summary: params.summary, analysis: params.analysis, }); - // 添加評估要點 - basePrompt += templates.evaluationPointsTemplate; - - // 添加決策點指導 - basePrompt += templates.decisionPointsTemplate; - - // 添加更新模式選擇指導 - basePrompt += templates.updateModesTemplate; - - // 添加知識傳遞機制指導 - basePrompt += templates.knowledgeTransferTemplate; - - // 添加任務過多處理指導 - basePrompt += templates.taskOverflowTemplate; - - // 添加結尾提醒 - basePrompt += templates.conclusionTemplate; - // 載入可能的自定義 prompt - return loadPrompt(basePrompt, "REFLECT_TASK"); + return loadPrompt(prompt, "REFLECT_TASK"); } diff --git a/src/prompts/generators/splitTasks.ts b/src/prompts/generators/splitTasks.ts index 9a582ce..be4ae41 100644 --- a/src/prompts/generators/splitTasks.ts +++ b/src/prompts/generators/splitTasks.ts @@ -3,8 +3,11 @@ * 負責將模板和參數組合成最終的 prompt */ -import { loadPrompt, generatePrompt } from "../loader.js"; -import * as templates from "../templates/splitTasks.js"; +import { + loadPrompt, + generatePrompt, + loadPromptFromTemplate, +} from "../loader.js"; import { Task } from "../../types/index.js"; /** @@ -16,126 +19,65 @@ export interface SplitTasksPromptParams { allTasks: Task[]; } -/** - * 獲取更新模式描述 - * @param updateMode 更新模式 - * @returns 更新模式的描述文字 - */ -function getUpdateModeDescription(updateMode: string): string { - switch (updateMode) { - case "overwrite": - return "覆蓋未完成任務(已完成任務已保留)"; - case "selective": - return "選擇性更新"; - case "append": - default: - return "新增至現有任務清單"; - } -} - -/** - * 格式化單個任務顯示內容 - * @param task 任務 - * @param index 任務索引 - * @param allTasks 所有任務列表,用於查找依賴任務名稱 - * @returns 格式化後的任務顯示文字 - */ -function formatTaskItem(task: Task, index: number, allTasks: Task[]): string { - // 處理注意事項 - const notes = task.notes ? `**注意事項:** ${task.notes}\n` : ""; - - // 處理實現指南 - const implementationGuide = task.implementationGuide - ? `**實現指南:** ${ - task.implementationGuide.length > 100 - ? task.implementationGuide.substring(0, 100) + - "... (執行時可查看完整內容)" - : task.implementationGuide - }\n` - : ""; - - // 處理驗證標準 - const verificationCriteria = task.verificationCriteria - ? `**驗證標準:** ${ - task.verificationCriteria.length > 100 - ? task.verificationCriteria.substring(0, 100) + - "... (驗證時可查看完整內容)" - : task.verificationCriteria - }\n` - : ""; - - // 處理依賴任務 - const dependencies = - task.dependencies && task.dependencies.length > 0 - ? `**依賴任務:** ${task.dependencies - .map((d: any) => { - // 查找依賴任務的名稱,提供更友好的顯示 - const depTask = allTasks.find((t) => t.id === d.taskId); - return depTask - ? `"${depTask.name}" (\`${d.taskId}\`)` - : `\`${d.taskId}\``; - }) - .join(", ")}\n` - : "**依賴任務:** 無\n"; - - // 使用模板生成任務項目 - return generatePrompt(templates.taskItemTemplate, { - index: index + 1, - name: task.name, - id: task.id, - description: task.description, - notes, - implementationGuide, - verificationCriteria, - dependencies, - }); -} - /** * 獲取 splitTasks 的完整 prompt * @param params prompt 參數 * @returns 生成的 prompt */ export function getSplitTasksPrompt(params: SplitTasksPromptParams): string { - // 開始構建基本 prompt - let basePrompt = generatePrompt(templates.splitTasksTitleTemplate, { - updateMode: params.updateMode, - }); + const taskDetailsTemplate = loadPromptFromTemplate( + "splitTasks/taskDetails.md" + ); - // 添加更新模式描述 - basePrompt += generatePrompt(templates.updateModeDescriptionTemplate, { - updateDescription: getUpdateModeDescription(params.updateMode), - }); + const tasksContent = params.createdTasks + .map((task, index) => { + let implementationGuide = "no implementation guide"; + if (task.implementationGuide) { + implementationGuide = + task.implementationGuide.length > 100 + ? task.implementationGuide.substring(0, 100) + "..." + : task.implementationGuide; + } - // 添加拆分策略 - basePrompt += templates.splitStrategyTemplate; + let verificationCriteria = "no verification criteria"; + if (task.verificationCriteria) { + verificationCriteria = + task.verificationCriteria.length > 100 + ? task.verificationCriteria.substring(0, 100) + "..." + : task.verificationCriteria; + } - // 添加任務質量審核 - basePrompt += templates.qualityReviewTemplate; + const dependencies = task.dependencies + ? task.dependencies + .map((d: any) => { + // 查找依賴任務的名稱,提供更友好的顯示 + const depTask = params.allTasks.find((t) => t.id === d.taskId); + return depTask + ? `"${depTask.name}" (\`${d.taskId}\`)` + : `\`${d.taskId}\``; + }) + .join(", ") + : "no dependencies"; - // 添加任務清單標題 - basePrompt += templates.taskListTitleTemplate; - - // 添加所有建立的任務 - basePrompt += params.createdTasks - .map((task, index) => formatTaskItem(task, index, params.allTasks)) + return generatePrompt(taskDetailsTemplate, { + index: index + 1, + name: task.name, + id: task.id, + description: task.description, + notes: task.notes || "no notes", + implementationGuide: implementationGuide, + verificationCriteria: verificationCriteria, + dependencies: dependencies, + }); + }) .join("\n"); - // 添加空行 - basePrompt += "\n\n"; - - // 添加依賴關係管理 - basePrompt += templates.dependencyManagementTemplate; - basePrompt += templates.dependencyManagementContent1; - basePrompt += templates.dependencyManagementContent2; - basePrompt += templates.dependencyManagementContent3; - basePrompt += templates.dependencyManagementContent4; - - // 添加決策點 - basePrompt += templates.decisionPointsTemplate; - basePrompt += templates.decisionPointContent1; - basePrompt += templates.decisionPointContent2; + const indexTemplate = loadPromptFromTemplate("splitTasks/index.md"); + const prompt = generatePrompt(indexTemplate, { + updateMode: params.updateMode, + tasksContent, + }); // 載入可能的自定義 prompt - return loadPrompt(basePrompt, "SPLIT_TASKS"); + return loadPrompt(prompt, "SPLIT_TASKS"); } diff --git a/src/prompts/generators/verifyTask.ts b/src/prompts/generators/verifyTask.ts index 2721b02..8b35a65 100644 --- a/src/prompts/generators/verifyTask.ts +++ b/src/prompts/generators/verifyTask.ts @@ -3,8 +3,11 @@ * 負責將模板和參數組合成最終的 prompt */ -import { loadPrompt, generatePrompt } from "../loader.js"; -import * as templates from "../templates/verifyTask.js"; +import { + loadPrompt, + generatePrompt, + loadPromptFromTemplate, +} from "../loader.js"; import { Task } from "../../types/index.js"; /** @@ -20,7 +23,10 @@ export interface VerifyTaskPromptParams { * @param maxLength 最大長度 * @returns 提取的摘要 */ -function extractSummary(content: string, maxLength: number): string { +function extractSummary( + content: string | undefined, + maxLength: number +): string { if (!content) return ""; if (content.length <= maxLength) { @@ -38,56 +44,21 @@ function extractSummary(content: string, maxLength: number): string { */ export function getVerifyTaskPrompt(params: VerifyTaskPromptParams): string { const { task } = params; - - // 處理注意事項 - const notes = task.notes ? `**注意事項:** ${task.notes}\n` : ""; - - // 開始構建基本 prompt - let basePrompt = generatePrompt(templates.verifyTaskTemplate, { + const indexTemplate = loadPromptFromTemplate("verifyTask/index.md"); + const prompt = generatePrompt(indexTemplate, { name: task.name, id: task.id, description: task.description, - notes: notes, + notes: task.notes || "no notes", + verificationCriteria: + task.verificationCriteria || "no verification criteria", + implementationGuideSummary: + extractSummary(task.implementationGuide, 200) || + "no implementation guide", + analysisResult: + extractSummary(task.analysisResult, 300) || "no analysis result", }); - // 添加任務特定的驗證標準(如果有) - if (task.verificationCriteria) { - basePrompt += generatePrompt(templates.verificationCriteriaTemplate, { - verificationCriteria: task.verificationCriteria, - }); - } - - // 添加實現指南摘要(如果有) - if (task.implementationGuide) { - const implementationGuideSummary = - task.implementationGuide.length > 200 - ? task.implementationGuide.substring(0, 200) + "... (參見完整實現指南)" - : task.implementationGuide; - - basePrompt += generatePrompt(templates.implementationGuideSummaryTemplate, { - implementationGuideSummary: implementationGuideSummary, - }); - } - - // 添加分析結果摘要(如果有) - if (task.analysisResult) { - basePrompt += generatePrompt(templates.analysisSummaryTemplate, { - analysisSummary: extractSummary(task.analysisResult, 300), - }); - } - - // 添加標準驗證標準 - basePrompt += templates.standardVerificationCriteriaTemplate; - - // 添加報告要求 - basePrompt += templates.reportRequirementsTemplate; - - // 添加決策點 - basePrompt += templates.decisionPointsTemplate; - basePrompt += templates.decisionPoint1; - basePrompt += templates.decisionPoint2; - basePrompt += templates.decisionPoint3; - // 載入可能的自定義 prompt - return loadPrompt(basePrompt, "VERIFY_TASK"); + return loadPrompt(prompt, "VERIFY_TASK"); } diff --git a/src/prompts/index.ts b/src/prompts/index.ts index 7d515ae..e80adf1 100644 --- a/src/prompts/index.ts +++ b/src/prompts/index.ts @@ -19,7 +19,3 @@ export { getListTasksPrompt } from "./generators/listTasks.js"; export { getQueryTaskPrompt } from "./generators/queryTask.js"; export { getGetTaskDetailPrompt } from "./generators/getTaskDetail.js"; export { getInitProjectRulesPrompt } from "./generators/initProjectRules.js"; -// 等等 - -// 導入初始化專案規範模板 -export { initProjectRulesTemplate } from "./templates/initProjectRules.js"; diff --git a/src/prompts/loader.ts b/src/prompts/loader.ts index 9398b3e..dfcd463 100644 --- a/src/prompts/loader.ts +++ b/src/prompts/loader.ts @@ -3,6 +3,13 @@ * 提供從環境變數載入自定義 prompt 的功能 */ +import fs from "fs"; +import path from "path"; +import { fileURLToPath } from "url"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + function processEnvString(input: string | undefined): string { if (!input) return ""; @@ -65,3 +72,16 @@ export function generatePrompt( return result; } + +/** + * 從模板載入 prompt + * @param templatePath 模板路徑 + * @returns 模板 + */ +export function loadPromptFromTemplate(templatePath: string): string { + const template = fs.readFileSync( + path.join(__dirname, "templates", templatePath), + "utf-8" + ); + return template; +} diff --git a/src/prompts/templates/analyzeTask.ts b/src/prompts/templates/analyzeTask.ts deleted file mode 100644 index d5ad1a0..0000000 --- a/src/prompts/templates/analyzeTask.ts +++ /dev/null @@ -1,43 +0,0 @@ -/** - * 任務分析 prompt 模板 - * 包含所有用於構建完整 analyzeTask prompt 的模板片段 - */ - -// 基本任務分析模板 -export const analyzeTaskTemplate = `**請嚴格遵守以下指導**\n## 代碼庫分析\n\n### 任務摘要\n\`\`\`\n{summary}\n\`\`\`\n\n已收到初步解答構想:\n\n\`\`\`\n{initialConcept}\n\`\`\`\n\n`; - -// 技術審核要點模板 -export const technicalReviewTemplate = `## 技術審核要點\n\n### 1. 代碼庫分析 -- 尋找可重用組件和類似實現 -- 確定新功能的適當位置 -- 評估與現有模塊的整合方式 - -### 2. 技術策略評估 -- 考慮模塊化和可擴展性設計 -- 評估提案的未來兼容性 -- 規劃測試策略和覆蓋範圍 - -### 3. 風險和質量分析 -- 識別技術債務和效能瓶頸 -- 評估安全性和數據完整性 -- 檢查錯誤處理機制 - -### 4. 實施建議 -- 遵循項目架構風格 -- 建議實施方法和技術選擇 -- 提出明確開發步驟 - -注意尋找程式碼重用機會,避免重複實作已有功能,降低技術債務風險。`; - -// 迭代分析模板(用於分析已有的前次分析結果) -export const iterationAnalysisTemplate = `\n\n## 迭代分析\n\n請對照先前分析結果:\n\n\`\`\`\n{previousAnalysis}\n\`\`\`\n\n請識別: -1. 已解決的問題及解決方案有效性 -2. 仍存在的問題及其優先級 -3. 新方案如何解決未解決問題 -4. 迭代過程中獲得的新見解`; - -// 下一步行動模板 -export const nextActionTemplate = `\n\n## 下一步行動\n\n完成分析後,使用「reflect_task」工具提交最終分析,包含:\n\n1. **原始任務摘要** - 保持與第一階段一致 -2. **完整分析結果** - 技術細節、接口依賴、實施策略、驗收標準 - -您的分析將決定解決方案質量,請全面考慮各種技術因素和業務約束。`; diff --git a/src/prompts/templates/analyzeTask/index.md b/src/prompts/templates/analyzeTask/index.md new file mode 100644 index 0000000..7115292 --- /dev/null +++ b/src/prompts/templates/analyzeTask/index.md @@ -0,0 +1,50 @@ +**請嚴格遵守以下指導** + +## 代碼庫分析 + +### 任務摘要 + +{summary} + +### 解答構想 + +{initialConcept} + +## 技術審核要點 + +注意尋找程式碼重用機會,避免重複實作已有功能,降低技術債務風險。 + +### 1. 代碼庫分析 + +- 尋找可重用組件和類似實現 +- 確定新功能的適當位置 +- 評估與現有模塊的整合方式 + +### 2. 技術策略評估 + +- 考慮模塊化和可擴展性設計 +- 評估提案的未來兼容性 +- 規劃測試策略和覆蓋範圍 + +### 3. 風險和質量分析 + +- 識別技術債務和效能瓶頸 +- 評估安全性和數據完整性 +- 檢查錯誤處理機制 + +### 4. 實施建議 + +- 遵循項目架構風格 +- 建議實施方法和技術選擇 +- 提出明確開發步驟 + +{previousAnalysis} + +## 下一步行動 + +完成分析後,使用「reflect_task」工具提交最終分析,包含: + +1. **原始任務摘要** - 保持與第一階段一致 +2. **完整分析結果** - 技術細節、接口依賴、實施策略、驗收標準 + +您的分析將決定解決方案質量,請全面考慮各種技術因素和業務約束。 diff --git a/src/prompts/templates/analyzeTask/iteration.md b/src/prompts/templates/analyzeTask/iteration.md new file mode 100644 index 0000000..3315750 --- /dev/null +++ b/src/prompts/templates/analyzeTask/iteration.md @@ -0,0 +1,12 @@ +## 迭代分析 + +請對照先前分析結果: + +{previousAnalysis} + +請識別: + +1. 已解決的問題及解決方案有效性 +2. 仍存在的問題及其優先級 +3. 新方案如何解決未解決問題 +4. 迭代過程中獲得的新見解 diff --git a/src/prompts/templates/completeTask.ts b/src/prompts/templates/completeTask.ts deleted file mode 100644 index 45376e7..0000000 --- a/src/prompts/templates/completeTask.ts +++ /dev/null @@ -1,16 +0,0 @@ -/** - * 任務完成 prompt 模板 - * 包含所有用於構建完整 completeTask prompt 的模板片段 - */ - -// 基本任務完成確認模板 -export const completeTaskConfirmationTemplate = `**請嚴格遵守以下指導**\n## 任務完成確認\n\n任務 "{name}" (ID: \`{id}\`) 已於 {completionTime} 成功標記為完成。\n\n`; - -// 任務摘要要求模板 -export const taskSummaryRequirementsTemplate = `## 任務摘要要求\n\n請提供此次完成任務的摘要總結,包含以下關鍵要點:\n\n1. 任務目標與主要成果\n2. 實施的解決方案要點\n3. 遇到的主要挑戰及解決方法\n\n`; - -// 重要提示模板 -export const importantReminderTemplate = `**重要提示:** 請在當前回應中提供任務摘要總結。完成本次任務摘要後,請等待用戶明確指示後再繼續執行其他任務。請勿自動開始執行下一個任務。\n\n`; - -// 連續執行模式提示模板 -export const continuousModeReminderTemplate = `如果用戶要求連續執行任務,請使用「execute_task」工具開始執行下一個任務。`; diff --git a/src/prompts/templates/completeTask/index.md b/src/prompts/templates/completeTask/index.md new file mode 100644 index 0000000..608fb5f --- /dev/null +++ b/src/prompts/templates/completeTask/index.md @@ -0,0 +1,17 @@ +**請嚴格遵守以下指導** + +## 任務完成確認 + +任務 "{name}" (ID: `{id}`) 已於 {completionTime} 成功標記為完成。 + +## 任務摘要要求 + +請提供此次完成任務的摘要總結,包含以下關鍵要點: + +1. 任務目標與主要成果 +2. 實施的解決方案要點 +3. 遇到的主要挑戰及解決方法 + +**重要提示:** +請在當前回應中提供任務摘要總結。完成本次任務摘要後,請等待用戶明確指示後再繼續執行其他任務。請勿自動開始執行下一個任務。 +如果用戶要求連續執行任務,請使用「execute_task」工具開始執行下一個任務。 diff --git a/src/prompts/templates/executeTask.ts b/src/prompts/templates/executeTask.ts deleted file mode 100644 index 341bf5b..0000000 --- a/src/prompts/templates/executeTask.ts +++ /dev/null @@ -1,63 +0,0 @@ -/** - * 任務執行 prompt 模板 - * 包含所有用於構建完整 executeTask prompt 的模板片段 - */ - -// 基本任務執行模板 -export const executeTaskTemplate = `**請嚴格遵守以下指導**\n## 任務執行\n\n**名稱:** {name}\n**ID:** \`{id}\`\n**描述:** {description}\n{notes}\n`; - -// 實現指南模板 -export const implementationGuideTemplate = `\n## 實現指南\n\n{implementationGuide}\n\n`; - -// 驗證標準模板 -export const verificationCriteriaTemplate = `\n## 驗證標準\n\n{verificationCriteria}\n\n`; - -// 分析背景模板 -export const analysisResultTemplate = `\n## 分析背景\n\n{analysisResult}\n\n`; - -// 相關文件模板 -export const relatedFilesSummaryTemplate = `## 相關文件\n\n{relatedFilesSummary}\n\n`; - -// 相關文件未指定模板 -export const noRelatedFilesTemplate = `## 相關文件\n\n當前任務沒有關聯的文件。可以使用 \`update_task\` 工具添加相關文件,以便在執行任務時提供上下文。`; - -// 推薦相關文件模板 -export const recommendedFilesTemplate = `\n\n### 推薦操作\n基於任務描述,您可能需要查看以下相關文件:\n{potentialFiles}\n使用 update_task 工具關聯相關文件,以獲得更好的上下文記憶支持。`; - -// 依賴任務完成摘要模板 -export const dependencyTaskSummaryTemplate = `\n## 依賴任務完成摘要\n\n`; - -// 單個依賴任務摘要模板 -export const dependencyTaskItemTemplate = `### {name}\n{summary}\n\n`; - -// 任務複雜度評估模板 -export const complexityAssessmentTemplate = `\n## 任務複雜度評估\n\n- **複雜度級別:** {level}`; - -// 複雜度警告模板 -export const complexityWarningTemplate = `\n\n{complexityStyle}\n`; - -// 評估指標模板 -export const assessmentMetricsTemplate = `\n### 評估指標\n`; -export const descriptionLengthMetric = `- 描述長度: {descriptionLength} 字符\n`; -export const dependenciesCountMetric = `- 依賴任務數: {dependenciesCount} 個\n`; - -// 處理建議模板 -export const handlingRecommendationsTemplate = `\n### 處理建議\n`; -export const handlingRecommendation1 = `1. {recommendation1}\n`; -export const handlingRecommendation2 = `2. {recommendation2}\n`; - -// 執行步驟模板 -export const executionStepsTemplate = `\n## 執行步驟\n\n`; -export const executionStep1 = `1. **分析需求** - 理解任務需求和約束條件\n`; -export const executionStep2 = `2. **設計方案** - 制定實施計劃和測試策略\n`; -export const executionStep3 = `3. **實施方案** - 按計劃執行,處理邊緣情況\n`; -export const executionStep4 = `4. **測試驗證** - 確保功能正確性和穩健性\n`; - -// 質量要求模板 -export const qualityRequirementsTemplate = `\n## 質量要求\n\n`; -export const qualityRequirement1 = `- **範圍管理** - 僅修改相關代碼,避免功能蔓延\n`; -export const qualityRequirement2 = `- **代碼質量** - 符合編碼標準,處理異常情況\n`; -export const qualityRequirement3 = `- **效能考量** - 注意算法效率和資源使用\n\n`; - -// 完成提示模板 -export const completionReminderTemplate = `開始根據指示執行任務,執行完成後請直接使用「verify_task」工具進行驗證。`; diff --git a/src/prompts/templates/executeTask/analysisResult.md b/src/prompts/templates/executeTask/analysisResult.md new file mode 100644 index 0000000..618ca94 --- /dev/null +++ b/src/prompts/templates/executeTask/analysisResult.md @@ -0,0 +1,3 @@ +## 分析背景 + +{analysisResult} diff --git a/src/prompts/templates/executeTask/complexity.md b/src/prompts/templates/executeTask/complexity.md new file mode 100644 index 0000000..c2384d2 --- /dev/null +++ b/src/prompts/templates/executeTask/complexity.md @@ -0,0 +1,15 @@ +## 任務複雜度評估 + +- **複雜度級別:** {level} + +{complexityStyle} + +### 評估指標 + +- 描述長度: {descriptionLength} 字符 + +- 依賴任務數: {dependenciesCount} 個 + +### 處理建議 + +{recommendation} diff --git a/src/prompts/templates/executeTask/dependencyTasks.md b/src/prompts/templates/executeTask/dependencyTasks.md new file mode 100644 index 0000000..2494c99 --- /dev/null +++ b/src/prompts/templates/executeTask/dependencyTasks.md @@ -0,0 +1,3 @@ +## 依賴任務完成摘要 + +{{ dependencyTasks }} diff --git a/src/prompts/templates/executeTask/implementationGuide.md b/src/prompts/templates/executeTask/implementationGuide.md new file mode 100644 index 0000000..c8f1277 --- /dev/null +++ b/src/prompts/templates/executeTask/implementationGuide.md @@ -0,0 +1,3 @@ +## 實現指南 + +{implementationGuide} diff --git a/src/prompts/templates/executeTask/index.md b/src/prompts/templates/executeTask/index.md new file mode 100644 index 0000000..c8bac73 --- /dev/null +++ b/src/prompts/templates/executeTask/index.md @@ -0,0 +1,38 @@ +**請嚴格遵守以下指導** + +## 任務執行 + +**名稱:** {name} + +**ID:** `{id}` + +**描述:** {description} + +{notesTemplate} + +{implementationGuideTemplate} + +{verificationCriteriaTemplate} + +{analysisResultTemplate} + +{dependencyTasksTemplate} + +{relatedFilesSummaryTemplate} + +{complexityTemplate} + +## 執行步驟 + +1. **分析需求** - 理解任務需求和約束條件 +2. **設計方案** - 制定實施計劃和測試策略 +3. **實施方案** - 按計劃執行,處理邊緣情況 +4. **測試驗證** - 確保功能正確性和穩健性 + +## 質量要求 + +- **範圍管理** - 僅修改相關代碼,避免功能蔓延 +- **代碼質量** - 符合編碼標準,處理異常情況 +- **效能考量** - 注意算法效率和資源使用 + +開始根據指示執行任務,執行完成後請直接使用「verify_task」工具進行驗證。 diff --git a/src/prompts/templates/executeTask/notes.md b/src/prompts/templates/executeTask/notes.md new file mode 100644 index 0000000..732931e --- /dev/null +++ b/src/prompts/templates/executeTask/notes.md @@ -0,0 +1 @@ +**注意事項:** {notes} diff --git a/src/prompts/templates/executeTask/relatedFilesSummary.md b/src/prompts/templates/executeTask/relatedFilesSummary.md new file mode 100644 index 0000000..ff418c4 --- /dev/null +++ b/src/prompts/templates/executeTask/relatedFilesSummary.md @@ -0,0 +1,5 @@ +## 相關文件 + +可以使用 `update_task` 工具添加相關文件,以便在執行任務時提供上下文。 + +{relatedFilesSummary} diff --git a/src/prompts/templates/executeTask/verificationCriteria.md b/src/prompts/templates/executeTask/verificationCriteria.md new file mode 100644 index 0000000..04db0e9 --- /dev/null +++ b/src/prompts/templates/executeTask/verificationCriteria.md @@ -0,0 +1,3 @@ +## 驗證標準 + +{verificationCriteria} diff --git a/src/prompts/templates/getTaskDetail.ts b/src/prompts/templates/getTaskDetail.ts deleted file mode 100644 index ab7ea9b..0000000 --- a/src/prompts/templates/getTaskDetail.ts +++ /dev/null @@ -1,43 +0,0 @@ -/** - * 查詢任務詳情 prompt 模板 - * 包含所有用於構建完整 getTaskDetail prompt 的模板片段 - */ - -// 任務詳情標題模板 -export const taskDetailTitleTemplate = `## 任務完整詳情\n\n`; - -// 任務基本信息模板 -export const taskBasicInfoTemplate = `### {name}\n\n**ID:** \`{id}\`\n\n**狀態:** {status}\n\n**描述:**\n{description}\n\n`; - -// 任務注記模板 -export const taskNotesTemplate = `**注記:**\n{notes}\n\n`; - -// 任務依賴模板 -export const taskDependenciesTemplate = `**依賴任務:** {dependencies}\n\n`; - -// 任務實現指南模板 -export const taskImplementationGuideTemplate = `**實現指南:**\n\`\`\`\n{implementationGuide}\n\`\`\`\n\n`; - -// 任務驗證標準模板 -export const taskVerificationCriteriaTemplate = `**驗證標準:**\n\`\`\`\n{verificationCriteria}\n\`\`\`\n\n`; - -// 任務相關文件標題模板 -export const taskRelatedFilesTemplate = `**相關文件:**\n{files}\n`; - -// 單個相關文件模板 -export const taskRelatedFileItemTemplate = `- \`{path}\` ({type}){description}`; - -// 任務時間信息模板 -export const taskTimeInfoTemplate = `**創建時間:** {createdTime}\n**更新時間:** {updatedTime}\n`; - -// 任務完成時間模板 -export const taskCompletedTimeTemplate = `**完成時間:** {completedTime}\n\n`; - -// 任務完成摘要模板 -export const taskSummaryTemplate = `**完成摘要:**\n{summary}\n\n`; - -// 錯誤模板 - 找不到任務 -export const taskNotFoundTemplate = `## 錯誤\n\n找不到ID為 \`{taskId}\` 的任務。請確認任務ID是否正確。`; - -// 系統錯誤模板 -export const errorTemplate = `## 系統錯誤\n\n取得任務詳情時發生錯誤: {errorMessage}`; diff --git a/src/prompts/templates/getTaskDetail/complatedSummary.md b/src/prompts/templates/getTaskDetail/complatedSummary.md new file mode 100644 index 0000000..8e5bdfe --- /dev/null +++ b/src/prompts/templates/getTaskDetail/complatedSummary.md @@ -0,0 +1,5 @@ +**完成時間:** {completedTime} + +**完成摘要:** + +{summary} diff --git a/src/prompts/templates/getTaskDetail/dependencies.md b/src/prompts/templates/getTaskDetail/dependencies.md new file mode 100644 index 0000000..b5ad867 --- /dev/null +++ b/src/prompts/templates/getTaskDetail/dependencies.md @@ -0,0 +1 @@ +**依賴任務:** {dependencies} diff --git a/src/prompts/templates/getTaskDetail/error.md b/src/prompts/templates/getTaskDetail/error.md new file mode 100644 index 0000000..4a219b3 --- /dev/null +++ b/src/prompts/templates/getTaskDetail/error.md @@ -0,0 +1,3 @@ +## 系統錯誤 + +取得任務詳情時發生錯誤: {errorMessage} diff --git a/src/prompts/templates/getTaskDetail/implementationGuide.md b/src/prompts/templates/getTaskDetail/implementationGuide.md new file mode 100644 index 0000000..c86625f --- /dev/null +++ b/src/prompts/templates/getTaskDetail/implementationGuide.md @@ -0,0 +1,3 @@ +**實現指南:** + +{implementationGuide} diff --git a/src/prompts/templates/getTaskDetail/index.md b/src/prompts/templates/getTaskDetail/index.md new file mode 100644 index 0000000..07a525c --- /dev/null +++ b/src/prompts/templates/getTaskDetail/index.md @@ -0,0 +1,25 @@ +## 任務完整詳情 + +### {name} + +**ID:** `{id}` + +**狀態:** {status} + +**描述:**{description} + +{notesTemplate} + +{dependenciesTemplate} + +{implementationGuideTemplate} + +{verificationCriteriaTemplate} + +{relatedFilesTemplate} + +**創建時間:** {createdTime} + +**更新時間:** {updatedTime} + +{complatedSummaryTemplate} diff --git a/src/prompts/templates/getTaskDetail/notFound.md b/src/prompts/templates/getTaskDetail/notFound.md new file mode 100644 index 0000000..6c9f3ae --- /dev/null +++ b/src/prompts/templates/getTaskDetail/notFound.md @@ -0,0 +1,3 @@ +## 錯誤 + +找不到 ID 為 `{taskId}` 的任務。請確認任務 ID 是否正確。 diff --git a/src/prompts/templates/getTaskDetail/notes.md b/src/prompts/templates/getTaskDetail/notes.md new file mode 100644 index 0000000..732931e --- /dev/null +++ b/src/prompts/templates/getTaskDetail/notes.md @@ -0,0 +1 @@ +**注意事項:** {notes} diff --git a/src/prompts/templates/getTaskDetail/relatedFiles.md b/src/prompts/templates/getTaskDetail/relatedFiles.md new file mode 100644 index 0000000..91e86b6 --- /dev/null +++ b/src/prompts/templates/getTaskDetail/relatedFiles.md @@ -0,0 +1,3 @@ +**相關文件:** + +{files} diff --git a/src/prompts/templates/getTaskDetail/verificationCriteria.md b/src/prompts/templates/getTaskDetail/verificationCriteria.md new file mode 100644 index 0000000..76dd455 --- /dev/null +++ b/src/prompts/templates/getTaskDetail/verificationCriteria.md @@ -0,0 +1,3 @@ +**驗證標準:** + +{verificationCriteria} diff --git a/src/prompts/templates/initProjectRules.ts b/src/prompts/templates/initProjectRules/index.md similarity index 92% rename from src/prompts/templates/initProjectRules.ts rename to src/prompts/templates/initProjectRules/index.md index 4530157..5e1c771 100644 --- a/src/prompts/templates/initProjectRules.ts +++ b/src/prompts/templates/initProjectRules/index.md @@ -1,10 +1,4 @@ -/** - * 初始化專案規範 prompt 模板 - * 包含指導如何產生專案規範文件的提示詞 - */ - -// 基本提示詞模板 -export const initProjectRulesTemplate = `請用 「process_thought」 工具思考以下問題 +請用 「process_thought」 工具思考以下問題 # 專案規範初始化指南 @@ -14,11 +8,13 @@ export const initProjectRulesTemplate = `請用 「process_thought」 工具思 **必須生成一個專屬於 AI Agent 操作使用的專案規範文件(rules.md)。** **必須專注於以下關鍵目標:** + - 明確專案特定規則與限制,禁止包含通用開發知識 - 提供 AI 執行任務時所需的專案特定資訊 - 為 AI 決策過程提供明確指導 **強制規定:** + - 完成的規範必須使 AI Agent 能立即理解哪些檔案必須參考或修改 - 明確指示多檔案連動修改要求(例如修改 README.md 時必須同步修改 /docs/zh/README.md) - 使用命令式語言定義規則,避免解釋性內容 @@ -26,6 +22,7 @@ export const initProjectRulesTemplate = `請用 「process_thought」 工具思 - 請提供範例什麼事可以做的,什麼事不可以做的 **嚴重禁止:** + - 禁止包含通用開發知識 - 禁止包含 LLM 已知的通用開發知識 - 進行專案功能解釋 @@ -34,13 +31,16 @@ export const initProjectRulesTemplate = `請用 「process_thought」 工具思 請使用以下結構建立規範文件: -\`\`\`markdown +```markdown # 開發守則 + ## 標題 + ### 副標題 + - 規則一 - 規則二 -\`\`\` +``` ## 內容指南 @@ -72,4 +72,3 @@ export const initProjectRulesTemplate = `請用 「process_thought」 工具思 **思考完畢後請立即編輯 rules.md 文件,禁止呼叫「analyze_task」工具** **如果檔案已經存在或用戶要求更新,請思考規範是否已經過時,是否需要補充更新** **如果是更新模式,除非必要否則你應該保持現有的規範,以最小變更為原則的修改** -`; diff --git a/src/prompts/templates/listTasks.ts b/src/prompts/templates/listTasks.ts deleted file mode 100644 index f9f0e34..0000000 --- a/src/prompts/templates/listTasks.ts +++ /dev/null @@ -1,19 +0,0 @@ -/** - * 列出任務 prompt 模板 - * 包含所有用於構建完整 listTasks prompt 的模板片段 - */ - -// 任務管理儀表板標題模板 -export const dashboardTitleTemplate = `# 任務管理儀表板\n\n`; - -// 任務狀態概覽標題模板 -export const statusOverviewTitleTemplate = `## 任務狀態概覽\n\n`; - -// 單個任務狀態計數模板 -export const statusCountTemplate = `- **{status}**: {count} 個任務`; - -// 任務狀態分類標題模板 -export const statusSectionTitleTemplate = `## {status} ({count})\n\n`; - -// 系統通知模板 - 無任務 -export const noTasksNoticeTemplate = `## 系統通知\n\n目前系統中沒有{statusText}任務。請查詢其他狀態任務或先使用「split_tasks」工具創建任務結構,再進行後續操作。`; diff --git a/src/prompts/templates/listTasks/index.md b/src/prompts/templates/listTasks/index.md new file mode 100644 index 0000000..bf48e7e --- /dev/null +++ b/src/prompts/templates/listTasks/index.md @@ -0,0 +1,7 @@ +# 任務管理儀表板 + +## 任務狀態概覽 + +{statusCount} + +{taskDetailsTemplate} diff --git a/src/prompts/templates/listTasks/notFound.md b/src/prompts/templates/listTasks/notFound.md new file mode 100644 index 0000000..4e6ad07 --- /dev/null +++ b/src/prompts/templates/listTasks/notFound.md @@ -0,0 +1,3 @@ +# 系統通知 + +目前系統中沒有{statusText}任務。請查詢其他狀態任務或先使用「split_tasks」工具創建任務結構,再進行後續操作。 diff --git a/src/prompts/templates/listTasks/taskDetails.md b/src/prompts/templates/listTasks/taskDetails.md new file mode 100644 index 0000000..75e916f --- /dev/null +++ b/src/prompts/templates/listTasks/taskDetails.md @@ -0,0 +1,13 @@ +### {name} + +**ID:** `{id}` + +**描述:** {description} + +{complatedSummary} + +**依賴:** {dependencies} + +**創建時間:** {createAt} + +{complatedAt} diff --git a/src/prompts/templates/planTask.ts b/src/prompts/templates/planTask.ts deleted file mode 100644 index a917082..0000000 --- a/src/prompts/templates/planTask.ts +++ /dev/null @@ -1,99 +0,0 @@ -/** - * 任務計劃 prompt 模板 - * 包含所有用於構建完整 planTask prompt 的模板片段 - */ - -// 基本任務分析模板 -export const planTaskTemplate = `**請嚴格遵守以下指導**\n## 任務分析\n\n{description}\n\n`; - -// 要求與限制模板 -export const requirementsTemplate = `## 要求與限制\n\n{requirements}\n\n`; - -// 現有任務參考引導 -export const existingTasksReferenceTemplate = `## 現有任務參考\n\n`; - -// 已完成任務標題 -export const completedTasksTitleTemplate = `### 已完成任務\n\n`; - -// 已完成任務項目模板 -export const completedTaskItemTemplate = `{index}. **{taskName}** (ID: \`{taskId}\`)\n - 描述:{taskDescription}\n{completedTime}`; - -// 未完成任務標題 -export const pendingTasksTitleTemplate = `\n### 未完成任務\n\n`; - -// 未完成任務項目模板 -export const pendingTaskItemTemplate = `{index}. **{taskName}** (ID: \`{taskId}\`)\n - 描述:{taskDescription}\n - 狀態:{taskStatus}\n{dependencies}`; - -// 任務調整原則 -export const taskAdjustmentPrinciplesTemplate = `\n## 任務調整原則\n\n`; -export const taskAdjustmentPrinciplesContent = `1. **已完成任務保護** - 已完成任務不可修改或刪除\n`; -export const taskAdjustmentPrinciplesContent2 = `2. **未完成任務可調整** - 可根據新需求修改未完成任務\n`; -export const taskAdjustmentPrinciplesContent3 = `3. **任務ID一致性** - 引用現有任務必須使用原始ID\n`; -export const taskAdjustmentPrinciplesContent4 = `4. **依賴關係完整性** - 避免循環依賴,不依賴已標記移除的任務\n`; -export const taskAdjustmentPrinciplesContent5 = `5. **任務延續性** - 新任務應與現有任務構成連貫整體\n\n`; - -// 任務更新模式指導 -export const taskUpdateModesTemplate = `## 任務更新模式\n\n`; -export const taskUpdateModesContent1 = `### 1. **追加模式(append)**\n`; -export const taskUpdateModesContent1Detail = `- 保留所有現有任務,僅添加新任務\n`; -export const taskUpdateModesContent1Usage = `- 適用:逐步擴展功能,現有計劃仍有效\n\n`; - -export const taskUpdateModesContent2 = `### 2. **覆蓋模式(overwrite)**\n`; -export const taskUpdateModesContent2Detail = `- 清除所有現有未完成任務,完全使用新任務列表\n`; -export const taskUpdateModesContent2Usage = `- 適用:徹底變更方向,現有未完成任務已不相關\n\n`; - -export const taskUpdateModesContent3 = `### 3. **選擇性更新模式(selective)**\n`; -export const taskUpdateModesContent3Detail = `- 根據任務名稱匹配選擇性更新任務,保留其他現有任務\n`; -export const taskUpdateModesContent3Usage = `- 適用:部分調整任務計劃,保留部分未完成任務\n`; -export const taskUpdateModesContent3Mechanism = `- 工作原理:更新同名任務,創建新任務,保留其他任務\n\n`; - -// 分析指引模板 -export const analysisGuideTemplate = `## 分析指引\n\n1. 確定任務的目標和預期成果 -2. 識別技術挑戰和關鍵決策點 -3. 考慮潛在解決方案和替代方案 -4. 評估各方案優缺點 -5. 判斷是否需要分解為子任務 -6. 考慮與現有系統的集成需求\n\n`; - -// 任務記憶檢索模板 -export const memoryDirTemplate = `## 任務記憶檢索\n\n`; -export const memoryDirContent = `過去任務記錄儲存在 **{memoryDir}**。\n`; -export const memoryDirUsageGuide = `使用查詢工具時,請根據以下情境判斷:\n\n`; - -// 查詢建議模板 -export const queryRecommendationsTemplate = `### 查詢建議\n\n`; -export const queryHighPriority = `- **必查(高優先級)**:\n`; -export const queryHighPriorityItems = ` - 涉及修改或擴展現有功能,需了解原有實現\n`; -export const queryHighPriorityItems2 = ` - 任務描述提到需參考以往工作或已有實現經驗\n`; -export const queryHighPriorityItems3 = ` - 涉及系統內部技術實現或關鍵組件\n`; -export const queryHighPriorityItems4 = ` - 用戶要求必須查詢記憶\n\n`; - -export const queryMediumPriority = `- **可查(中優先級)**:\n`; -export const queryMediumPriorityItems = ` - 新功能與現有系統有整合需求,實現部分獨立\n`; -export const queryMediumPriorityItems2 = ` - 功能標準化且需符合系統慣例\n`; -export const queryMediumPriorityItems3 = ` - 不確定是否已有類似實現\n\n`; - -export const queryLowPriority = `- **可跳過(低優先級)**:\n`; -export const queryLowPriorityItems = ` - 完全全新、獨立的功能\n`; -export const queryLowPriorityItems2 = ` - 基本設置或簡單標準任務\n`; -export const queryLowPriorityItems3 = ` - 用戶明確指示不需參考過去記錄\n\n`; - -export const queryReminder = `> ※ 查詢記憶可幫助了解過往方案,借鑒成功經驗並避免重複錯誤。\n\n`; - -// 資訊收集指南模板 -export const infoCollectionGuideTemplate = `## 資訊收集指南\n\n`; -export const infoCollectionGuideItems = `1. **詢問用戶** - 當你對任務要求有疑問時,直接詢問用戶\n`; -export const infoCollectionGuideItems2 = `2. **查詢記憶** - 使用「query_task」工具查詢以往記憶是否有相關任務\n`; -export const infoCollectionGuideItems3 = `3. **網路搜索** - 當出現你不理解的名詞或概念時,使用網路搜尋工具找尋答案\n\n`; - -// 下一步模板 -export const nextStepsTemplate = `## 下一步\n\n⚠️ 重要:請先閱讀 {rulesPath} 規則再進行任何分析或設計 ⚠️\n\n`; -export const nextStepsContent1 = `**第一步:根據任務描述決定是否查詢記憶**\n`; -export const nextStepsContent1Detail = `- 判斷任務是否屬於必查情境,若是,請先使用「query_task」查詢過往記錄;否則,可直接進行分析。\n\n`; -export const nextStepsContent2 = `**第二步:使用 analyze_task 提交分析結果**\n`; -export const nextStepsContent2Detail1 = `1. **任務摘要** - 目標、範圍、挑戰和限制條件\n`; -export const nextStepsContent2Detail2 = `2. **初步解答構想** - 可行的技術方案和實施計劃\n`; - -export const nextStepsThoughtTemplate = `**第二步:必須強制使用「process_thought」思考答案 (禁止直接使用analyze_task)**\n`; -export const nextStepsThoughtDetail1 = `1. **強制思考過程** - 必須展示逐步推理過程,包括假設、驗證和調整\n`; -export const nextStepsThoughtDetail2 = `2. 警告:必須先使用「process_thought」工具思考,嚴格禁止直接使用analyze_task或直接回答\n`; diff --git a/src/prompts/templates/planTask/hasThought.md b/src/prompts/templates/planTask/hasThought.md new file mode 100644 index 0000000..f3f05ca --- /dev/null +++ b/src/prompts/templates/planTask/hasThought.md @@ -0,0 +1,4 @@ +**第二步:必須強制使用「process_thought」思考答案 (禁止直接使用 analyze_task)** + +1. **強制思考過程** - 必須展示逐步推理過程,包括假設、驗證和調整 +2. 警告:必須先使用「process_thought」工具思考,嚴格禁止直接使用 analyze_task 或直接回答 diff --git a/src/prompts/templates/planTask/index.md b/src/prompts/templates/planTask/index.md new file mode 100644 index 0000000..445a457 --- /dev/null +++ b/src/prompts/templates/planTask/index.md @@ -0,0 +1,62 @@ +**請嚴格遵守以下指導** + +## 任務分析 + +{description} + +## 要求與限制 + +{requirements} + +{tasksTemplate} + +## 分析指引 + +1. 確定任務的目標和預期成果 +2. 識別技術挑戰和關鍵決策點 +3. 考慮潛在解決方案和替代方案 +4. 評估各方案優缺點 +5. 判斷是否需要分解為子任務 +6. 考慮與現有系統的集成需求 + +## 任務記憶檢索 + +過去任務記錄儲存在 **{memoryDir}**。 + +使用查詢工具時,請根據以下情境判斷: + +- **必查(高優先級)**: + + - 涉及修改或擴展現有功能,需了解原有實現 + - 任務描述提到需參考以往工作或已有實現經驗 + - 涉及系統內部技術實現或關鍵組件 + - 用戶要求必須查詢記憶 + +- **可查(中優先級)**: + + - 新功能與現有系統有整合需求,實現部分獨立 + - 功能標準化且需符合系統慣例 + - 不確定是否已有類似實現 + +- **可跳過(低優先級)**: + - 完全全新、獨立的功能 + - 基本設置或簡單標準任務 + - 用戶明確指示不需參考過去記錄 + +> ※ 查詢記憶可幫助了解過往方案,借鑒成功經驗並避免重複錯誤。 + +## 資訊收集指南 + +1. **詢問用戶** - 當你對任務要求有疑問時,直接詢問用戶 +2. **查詢記憶** - 使用「query_task」工具查詢以往記憶是否有相關任務 +3. **網路搜索** - 當出現你不理解的名詞或概念時,使用網路搜尋工具找尋答案 + +## 下一步 + +⚠️ 重要:請先閱讀 {rulesPath} 規則再進行任何分析或設計 ⚠️ + +**第一步:根據任務描述決定是否查詢記憶** + +- 判斷任務是否屬於必查情境,若是,請先使用「query_task」查詢過往記錄;否則,可直接進行分析。 + +{thoughtTemplate} diff --git a/src/prompts/templates/planTask/noThought.md b/src/prompts/templates/planTask/noThought.md new file mode 100644 index 0000000..3058201 --- /dev/null +++ b/src/prompts/templates/planTask/noThought.md @@ -0,0 +1,4 @@ +**第二步:使用 analyze_task 提交分析結果** + +1. **任務摘要** - 目標、範圍、挑戰和限制條件 +2. **初步解答構想** - 可行的技術方案和實施計劃 diff --git a/src/prompts/templates/planTask/tasks.md b/src/prompts/templates/planTask/tasks.md new file mode 100644 index 0000000..f9d7369 --- /dev/null +++ b/src/prompts/templates/planTask/tasks.md @@ -0,0 +1,35 @@ +## 現有任務參考 + +### 已完成任務 + +{completedTasks} + +### 未完成任務 + +{unfinishedTasks} + +## 任務調整原則 + +1. **已完成任務保護** - 已完成任務不可修改或刪除 +2. **未完成任務可調整** - 可根據新需求修改未完成任務 +3. **任務 ID 一致性** - 引用現有任務必須使用原始 ID +4. **依賴關係完整性** - 避免循環依賴,不依賴已標記移除的任務 +5. **任務延續性** - 新任務應與現有任務構成連貫整體 + +## 任務更新模式 + +### 1. **追加模式(append)** + +- 保留所有現有任務,僅添加新任務 +- 適用:逐步擴展功能,現有計劃仍有效 + +### 2. **覆蓋模式(overwrite)** + +- 清除所有現有未完成任務,完全使用新任務列表 +- 適用:徹底變更方向,現有未完成任務已不相關 + +### 3. **選擇性更新模式(selective)** + +- 根據任務名稱匹配選擇性更新任務,保留其他現有任務 +- 適用:部分調整任務計劃,保留部分未完成任務 +- 工作原理:更新同名任務,創建新任務,保留其他任務 diff --git a/src/prompts/templates/queryTask.ts b/src/prompts/templates/queryTask.ts deleted file mode 100644 index 93f5bac..0000000 --- a/src/prompts/templates/queryTask.ts +++ /dev/null @@ -1,143 +0,0 @@ -/** - * 查詢任務 prompt 模板 - * 包含所有用於構建完整 queryTask prompt 的模板片段 - */ - -/** - * queryTask 相關的提示模板 - * 注意:所有變數格式已統一為 {變數} 格式,移除了 {{變數}} 格式 - */ - -/** - * 查詢模式模板 - 已將三元運算符拆分為兩個獨立常量 - */ -export const searchModeIdTemplate = "任務ID查詢"; -export const searchModeKeywordTemplate = "關鍵字查詢"; - -/** - * 查詢頭部模板 - * 注意:三元運算符已替換為 {searchMode} 變數 - */ -export const searchHeaderTemplate = ` -# 任務查詢結果 - -## 查詢資訊 -- 查詢詞: {query} -- 查詢模式: {searchMode} -- 總計找到: {totalTasks} 筆任務 -`; - -/** - * 沒有結果時的模板 - 已拆分為ID查詢和關鍵字查詢兩個獨立模板 - * 原模板保留作為參考: - * export const noResultsTemplate = ` - * ## 無符合結果 - * 沒有找到符合 "{query}" 的任務。 - * - * ### 可能的原因: - * {{#if isId}} - * - 您提供的任務ID不存在或格式不正確 - * - 任務可能已被刪除 - * {{else}} - * - 關鍵字拼寫可能有誤 - * - 請嘗試使用更簡短或相近的關鍵詞 - * - 任務清單可能為空 - * {{/if}} - * - * 您可以使用 \`list_tasks\` 命令查看所有現有任務。 - * `; - */ - -/** - * 沒有結果時的模板 - ID查詢 - */ -export const noResultsIdTemplate = ` -## 無符合結果 -沒有找到符合 "{query}" 的任務。 - -### 可能的原因: -- 您提供的任務ID不存在或格式不正確 -- 任務可能已被刪除 - -您可以使用 \`list_tasks\` 命令查看所有現有任務。 -`; - -/** - * 沒有結果時的模板 - 關鍵字查詢 - */ -export const noResultsKeywordTemplate = ` -## 無符合結果 -沒有找到符合 "{query}" 的任務。 - -### 可能的原因: -- 關鍵字拼寫可能有誤 -- 請嘗試使用更簡短或相近的關鍵詞 -- 任務清單可能為空 - -您可以使用 \`list_tasks\` 命令查看所有現有任務。 -`; - -/** - * 結果列表頭部模板 - */ -export const resultListHeaderTemplate = ` -## 任務列表 -以下是符合查詢的任務: - -`; - -/** - * 分頁資訊模板 - */ -export const paginationInfoTemplate = ` -## 分頁資訊 -- 當前頁: {page} / {totalPages} -- 每頁顯示: {pageSize} 筆 -- 總計結果: {totalTasks} 筆 - -您可以指定 page 參數查看更多結果。 -`; - -/** - * 任務摘要模板 - */ -export const taskSummaryTemplate = ` -### {taskName} (ID: {taskId}) -- 狀態: {taskStatus} -- 描述: {taskDescription} -- 建立時間: {createdAt} -- 完成時間: {completedAt} -`; - -/** - * 使用提示模板 - */ -export const usageHintTemplate = ` -## 相關操作提示 -- 使用 \`get_task_detail {任務ID}\` 查看任務完整詳情 -- 使用 \`execute_task {任務ID}\` 執行特定任務 -- 使用 \`list_tasks\` 查看所有任務 -`; - -// 查詢結果標題模板 -export const queryResultTitleTemplate = `## 查詢結果 ({totalResults})\n\n`; - -// 單個任務顯示模板 -export const taskDisplayTemplate = `### {name} -**ID:** \`{id}\` -**狀態:** {status} -**描述:** {description} -{notes} -{implementationGuide} -{verificationCriteria} -{summary} -**創建時間:** {createdTime} -**更新時間:** {updatedTime} -{completedTime} -**詳細內容:** 請使用「get_task_detail」工具查看 {id} 完整任務詳情`; - -// 下一頁指示模板 -export const nextPageGuideTemplate = `\n\n要查看下一頁結果,請使用相同的查詢參數,但將頁碼設為 {nextPage}。`; - -// 系統錯誤模板 -export const errorTemplate = `## 系統錯誤\n\n查詢任務時發生錯誤: {errorMessage}`; diff --git a/src/prompts/templates/queryTask/index.md b/src/prompts/templates/queryTask/index.md new file mode 100644 index 0000000..f0d908c --- /dev/null +++ b/src/prompts/templates/queryTask/index.md @@ -0,0 +1,24 @@ +# 任務查詢結果 + +## 查詢資訊 + +- 查詢詞: {query} + +## 任務列表 + +以下是符合查詢的任務: + +{tasksContent} + +## 分頁資訊 + +- 當前頁: {page} / {totalPages} +- 每頁顯示: {pageSize} 筆 +- 總計結果: {totalTasks} 筆 + +您可以指定 page 參數查看更多結果。 + +## 相關操作提示 + +- 使用 `get_task_detail {任務ID}` 查看任務完整詳情 +- 使用 `list_tasks` 查看所有任務 diff --git a/src/prompts/templates/queryTask/notFound.md b/src/prompts/templates/queryTask/notFound.md new file mode 100644 index 0000000..88d884a --- /dev/null +++ b/src/prompts/templates/queryTask/notFound.md @@ -0,0 +1,15 @@ +# 任務查詢結果 + +## 無符合結果 + +沒有找到符合 "{query}" 的任務。 + +### 可能的原因: + +- 您提供的任務 ID 不存在或格式不正確 +- 任務可能已被刪除 +- 關鍵字拼寫可能有誤 +- 請嘗試使用更簡短或相近的關鍵詞 +- 任務清單可能為空 + +您可以使用 `list_tasks` 命令查看所有現有任務或使用其他關鍵字搜尋歷史紀錄。 diff --git a/src/prompts/templates/queryTask/taskDetails.md b/src/prompts/templates/queryTask/taskDetails.md new file mode 100644 index 0000000..091f045 --- /dev/null +++ b/src/prompts/templates/queryTask/taskDetails.md @@ -0,0 +1,5 @@ +### {taskName} (ID: {taskId}) + +- 狀態: {taskStatus} +- 描述: {taskDescription} +- 建立時間: {createdAt} diff --git a/src/prompts/templates/reflectTask.ts b/src/prompts/templates/reflectTask/index.md similarity index 60% rename from src/prompts/templates/reflectTask.ts rename to src/prompts/templates/reflectTask/index.md index af2ab82..e5bf624 100644 --- a/src/prompts/templates/reflectTask.ts +++ b/src/prompts/templates/reflectTask/index.md @@ -1,60 +1,68 @@ -/** - * 方案評估 prompt 模板 - * 包含所有用於構建完整 reflectTask prompt 的模板片段 - */ +**請嚴格遵守以下指導** -// 基本方案評估模板 -export const reflectTaskTemplate = `**請嚴格遵守以下指導**\n## 方案評估\n\n### 任務摘要\n\`\`\`\n{summary}\n\`\`\`\n\n### 分析結果\n\`\`\`\n{analysis}\n\`\`\`\n\n`; +## 方案評估 + +### 任務摘要 + +{summary} + +### 分析結果 + +{analysis} + +## 評估要點 -// 評估要點模板 -export const evaluationPointsTemplate = `## 評估要點 ### 1. 技術完整性 + - 檢查方案技術缺陷和邏輯漏洞 - 驗證邊緣情況和異常處理 - 確認數據流和控制流完整性 - 評估技術選型合理性 ### 2. 效能與可擴展性 + - 分析資源使用效率和優化空間 - 評估系統負載擴展能力 - 識別潛在優化點 - 考慮未來功能擴展可能性 ### 3. 需求符合度 + - 核對功能需求實現情況 - 檢查非功能性需求符合度 - 確認需求理解準確性 -- 評估用戶體驗和業務流程整合`; +- 評估用戶體驗和業務流程整合 + +## 決策點 -// 決策點模板 -export const decisionPointsTemplate = `## 決策點 根據評估結果選擇後續行動: + - **發現關鍵問題**:使用「analyze_task」重新提交改進方案 - **輕微調整**:在下一步執行中應用這些小的改進 -- **方案完善**:使用「split_tasks」將解決方案分解為可執行子任務,如果任務太多或內容過長,請使用多次使用「split_tasks」工具,每次只提交一小部分任務\n\n`; +- **方案完善**:使用「split_tasks」將解決方案分解為可執行子任務,如果任務太多或內容過長,請使用多次使用「split_tasks」工具,每次只提交一小部分任務 + +## split_tasks 更新模式選擇 -// 更新模式選擇模板 -export const updateModesTemplate = `## split_tasks 更新模式選擇 - **append** - 保留所有現有任務並添加新任務 - **overwrite** - 清除未完成任務,保留已完成任務 - **selective** - 選擇性更新特定任務,保留其他任務 -- **clearAllTasks** - 清除所有任務並創建備份\n\n`; +- **clearAllTasks** - 清除所有任務並創建備份 + +## 知識傳遞機制 -// 知識傳遞機制模板 -export const knowledgeTransferTemplate = `## 知識傳遞機制 1. **全局分析結果** - 關聯完整分析文檔 2. **任務專屬實現指南** - 每個任務保存具體實現方法 -3. **任務專屬驗證標準** - 設置明確驗證要求\n\n`; +3. **任務專屬驗證標準** - 設置明確驗證要求 + +## 任務拆分指南(請嚴格遵守以下規則) -// 任務過多處理模板 -export const taskOverflowTemplate = `## 任務拆分指南(請嚴格遵守以下規則) - **原子性**:每個子任務應該可獨立運作或測試 - **依賴性**:如果任務依賴於其他任務請標註 「dependencies」 字段 - **適度拆分**:避免過度細化(粒度過小)或過度合併(粒度過大) - **必要時整合**:修改的內容不多或不複雜,可以適當於其他任務整合,避免任務過於簡單造成任務過多 - **重複調用**:如果任務太多或內容過長導致「split_tasks」工具無法正常運作時,請使用多次使用「split_tasks」工具,每次只提交一小部分任務 - **簡化任務**:如果每次只新增一個任務還是無法正常運作,請考慮再次拆分任務,或者簡化任務但必須保留核心內容 -- **嚴重警告** 你每次呼叫 split_tasks 傳遞的參數不能超過8000個字,如果超出 8000 個字請多次呼叫工具完成\n\n`; -// 結尾提醒模板 -export const conclusionTemplate = `請嚴格審查方案,確保解決方案質量。`; +**嚴重警告** 你每次呼叫 split_tasks 傳遞的參數不能超過 5000 個字,如果超出 5000 個字請多次呼叫工具完成 + +**現在開始呼叫「split_tasks」工具** diff --git a/src/prompts/templates/splitTasks.ts b/src/prompts/templates/splitTasks.ts deleted file mode 100644 index 112e84a..0000000 --- a/src/prompts/templates/splitTasks.ts +++ /dev/null @@ -1,46 +0,0 @@ -/** - * 任務拆分 prompt 模板 - * 包含所有用於構建完整 splitTasks prompt 的模板片段 - */ - -// 任務拆分標題模板 -export const splitTasksTitleTemplate = `## 任務拆分 - {updateMode} 模式\n\n`; - -// 任務更新模式描述模板 -export const updateModeDescriptionTemplate = `任務已{updateDescription}。\n\n`; - -// 任務拆分策略模板 -export const splitStrategyTemplate = `## 拆分策略\n\n1. **按功能分解** - 獨立可測試的子功能,明確輸入輸出 -2. **按技術層次分解** - 沿架構層次分離任務,確保接口明確 -3. **按開發階段分解** - 核心功能先行,優化功能後續 -4. **按風險分解** - 隔離高風險部分,降低整體風險\n\n`; - -// 任務質量審核模板 -export const qualityReviewTemplate = `## 任務質量審核\n\n1. **任務原子性** - 每個任務足夠小且具體,可獨立完成 -2. **依賴關係** - 任務依賴形成有向無環圖,避免循環依賴 -3. **描述完整性** - 每個任務描述清晰準確,包含必要上下文\n\n`; - -// 任務清單標題模板 -export const taskListTitleTemplate = `## 任務清單\n\n`; - -// 單個任務顯示模板 -export const taskItemTemplate = `### 任務 {index}:{name} -**ID:** \`{id}\` -**描述:** {description} -{notes} -{implementationGuide} -{verificationCriteria} -{dependencies} -`; - -// 依賴關係管理模板 -export const dependencyManagementTemplate = `## 依賴關係管理\n\n`; -export const dependencyManagementContent1 = `- 設置依賴可使用任務名稱或任務ID\n`; -export const dependencyManagementContent2 = `- 最小化依賴數量,只設置直接前置任務\n`; -export const dependencyManagementContent3 = `- 避免循環依賴,確保任務圖有向無環\n`; -export const dependencyManagementContent4 = `- 平衡關鍵路徑,優化並行執行可能性\n\n`; - -// 決策點模板 -export const decisionPointsTemplate = `## 決策點\n\n`; -export const decisionPointContent1 = `- 發現任務拆分不合理:重新呼叫「split_tasks」調整\n`; -export const decisionPointContent2 = `- 確認任務拆分完善:生成執行計劃,確定優先順序\n- **嚴重警告** 你每次呼叫 split_tasks 傳遞的參數不能超過8000個字,如果超出 8000 個字請多次呼叫工具完成`; diff --git a/src/prompts/templates/splitTasks/index.md b/src/prompts/templates/splitTasks/index.md new file mode 100644 index 0000000..7d7adf0 --- /dev/null +++ b/src/prompts/templates/splitTasks/index.md @@ -0,0 +1,34 @@ +## 任務拆分 - {updateMode} 模式 + +## 拆分策略 + +1. **按功能分解** - 獨立可測試的子功能,明確輸入輸出 +2. **按技術層次分解** - 沿架構層次分離任務,確保接口明確 +3. **按開發階段分解** - 核心功能先行,優化功能後續 +4. **按風險分解** - 隔離高風險部分,降低整體風險 + +## 任務質量審核 + +1. **任務原子性** - 每個任務足夠小且具體,可獨立完成 +2. **依賴關係** - 任務依賴形成有向無環圖,避免循環依賴 +3. **描述完整性** - 每個任務描述清晰準確,包含必要上下文 + +## 任務清單 + +{tasksContent} + +## 依賴關係管理 + +- 設置依賴可使用任務名稱或任務 ID +- 最小化依賴數量,只設置直接前置任務 +- 避免循環依賴,確保任務圖有向無環 +- 平衡關鍵路徑,優化並行執行可能性 + +## 決策點 + +- 發現任務拆分不合理:重新呼叫「split_tasks」調整 +- 確認任務拆分完善:生成執行計劃,確定優先順序 + +**嚴重警告** 你每次呼叫 split_tasks 傳遞的參數不能超過 5000 個字,如果超出 5000 個字請多次呼叫工具完成 + +**如果還有剩餘任務請繼續呼叫「split_tasks」** diff --git a/src/prompts/templates/splitTasks/taskDetails.md b/src/prompts/templates/splitTasks/taskDetails.md new file mode 100644 index 0000000..e94c470 --- /dev/null +++ b/src/prompts/templates/splitTasks/taskDetails.md @@ -0,0 +1,12 @@ +### 任務 {index}:{name} + +**ID:** `{id}` +**描述:** {description} + +**注意事項:** {notes} + +**實現指南:** {implementationGuide} + +**驗證標準:** {verificationCriteria} + +**依賴任務:** {dependencies} diff --git a/src/prompts/templates/verifyTask.ts b/src/prompts/templates/verifyTask.ts deleted file mode 100644 index 6aa7cb0..0000000 --- a/src/prompts/templates/verifyTask.ts +++ /dev/null @@ -1,28 +0,0 @@ -/** - * 任務驗證 prompt 模板 - * 包含所有用於構建完整 verifyTask prompt 的模板片段 - */ - -// 基本任務驗證模板 -export const verifyTaskTemplate = `**請嚴格遵守以下指導**\n## 任務驗證\n\n**名稱:** {name}\n**ID:** \`{id}\`\n**描述:** {description}\n{notes}\n`; - -// 驗證標準模板 -export const verificationCriteriaTemplate = `\n## 驗證標準\n\n{verificationCriteria}\n\n`; - -// 實現指南摘要模板 -export const implementationGuideSummaryTemplate = `\n## 實現指南摘要\n\n{implementationGuideSummary}\n\n`; - -// 分析要點模板 -export const analysisSummaryTemplate = `\n## 分析要點\n\n{analysisSummary}\n\n`; - -// 標準驗證標準模板 -export const standardVerificationCriteriaTemplate = `## 驗證標準\n\n1. **需求符合性(30%)** - 功能完整性、約束條件遵循、邊緣情況處理\n2. **技術質量(30%)** - 架構一致性、程式健壯性、實現優雅性\n3. **集成兼容性(20%)** - 系統整合、互操作性、兼容性維護\n4. **性能可擴展性(20%)** - 效能優化、負載適應性、資源管理\n\n`; - -// 報告要求模板 -export const reportRequirementsTemplate = `## 報告要求\n\n提供整體評分和評級,各項標準評估,問題與建議,及最終結論。\n\n`; - -// 決策點模板 -export const decisionPointsTemplate = `## 下一步\n\n**根據驗證結果選擇你的下一步行動:**\n`; -export const decisionPoint1 = `- **嚴重錯誤**:直接使用「plan_task」工具重新規劃任務\n`; -export const decisionPoint2 = `- **輕微錯誤**:直接修復問題\n`; -export const decisionPoint3 = `- **無錯誤**:直接使用「complete_task」工具標記完成\n`; diff --git a/src/prompts/templates/verifyTask/index.md b/src/prompts/templates/verifyTask/index.md new file mode 100644 index 0000000..e9e1fa7 --- /dev/null +++ b/src/prompts/templates/verifyTask/index.md @@ -0,0 +1,44 @@ +**請嚴格遵守以下指導** + +## 任務驗證 + +**名稱:** {name} + +**ID:** `{id}` + +**描述:** {description} + +**注意事項:** {notes} + +## 驗證標準 + +{verificationCriteria} + +## 實現指南摘要 + +{implementationGuideSummary} + +## 分析要點 + +{analysisSummary} + +## 驗證標準 + +1. **需求符合性(30%)** - 功能完整性、約束條件遵循、邊緣情況處理 +2. **技術質量(30%)** - 架構一致性、程式健壯性、實現優雅性 +3. **集成兼容性(20%)** - 系統整合、互操作性、兼容性維護 +4. **性能可擴展性(20%)** - 效能優化、負載適應性、資源管理 + +## 報告要求 + +提供整體評分和評級,各項標準評估,問題與建議,及最終結論。 + +## 下一步 + +**根據驗證結果選擇你的下一步行動:** + +- **嚴重錯誤**:直接使用「plan_task」工具重新規劃任務 +- **輕微錯誤**:直接修復問題 +- **無錯誤**:直接使用「complete_task」工具標記完成 + +**請直接決定你的下一步行為,請勿詢問用戶** diff --git a/src/tools/taskTools.ts b/src/tools/taskTools.ts index f7c036c..d14bb1d 100644 --- a/src/tools/taskTools.ts +++ b/src/tools/taskTools.ts @@ -661,43 +661,12 @@ export async function executeTask({ } } - // 嘗試自動發現相關文件 - let potentialFiles: string[] = []; - if (!task.relatedFiles || task.relatedFiles.length === 0) { - // 基於任務名稱和描述關鍵詞,嘗試推測可能相關的文件 - const taskWords = [ - ...task.name.split(/[\s,.;:]+/), - ...task.description.split(/[\s,.;:]+/), - ] - .filter((word) => word.length > 3) - .map((word) => word.toLowerCase()); - - // 從關鍵詞中提取可能的文件名或路徑片段 - potentialFiles = taskWords.filter( - (word) => - /^[a-z0-9]+$/i.test(word) && - ![ - "task", - "function", - "model", - "index", - "with", - "from", - "this", - ].includes(word.toLowerCase()) - ); - - // 只保留前5個 - potentialFiles = potentialFiles.slice(0, 5); - } - // 使用prompt生成器獲取最終prompt const prompt = getExecuteTaskPrompt({ task, complexityAssessment, relatedFilesSummary, dependencyTasks, - potentialFiles, }); return {