gsd-pi 2.67.0-dev.43b0159 → 2.67.0-dev.46f9884
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/resources/extensions/gsd/commands/catalog.js +1 -2
- package/dist/resources/extensions/gsd/commands/dispatcher.js +1 -1
- package/dist/resources/extensions/gsd/commands/handlers/core.js +1 -91
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +5 -39
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +3 -3
- package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -3
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +5 -7
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +18 -18
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +18 -18
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +2 -2
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/{6502.b804e48b7919f55e.js → 6502.8874bcae249c02e1.js} +3 -3
- package/dist/web/standalone/.next/static/chunks/{webpack-65f0501b197d1c49.js → webpack-9fed74684e1c5bb1.js} +1 -1
- package/package.json +1 -1
- package/src/resources/extensions/gsd/commands/catalog.ts +1 -2
- package/src/resources/extensions/gsd/commands/dispatcher.ts +2 -1
- package/src/resources/extensions/gsd/commands/handlers/core.ts +2 -107
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +7 -38
- package/src/resources/extensions/gsd/prompts/complete-slice.md +3 -3
- package/src/resources/extensions/gsd/prompts/execute-task.md +3 -3
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +5 -7
- package/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts +0 -12
- package/src/resources/extensions/gsd/tests/core-overlay-fallback.test.ts +0 -32
- package/src/resources/extensions/gsd/tests/preferences.test.ts +0 -17
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +3 -18
- /package/dist/web/standalone/.next/static/{CrKrzIIxk55witDF1eS0L → FRT6f5ou3wPxpZ7ojoB7E}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{CrKrzIIxk55witDF1eS0L → FRT6f5ou3wPxpZ7ojoB7E}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
(()=>{"use strict";var e,a,f,c,d,b,t,r,o,n={},i={};function l(e){var a=i[e];if(void 0!==a)return a.exports;var f=i[e]={exports:{}},c=!0;try{n[e].call(f.exports,f,f.exports,l),c=!1}finally{c&&delete i[e]}return f.exports}l.m=n,e=[],l.O=(a,f,c,d)=>{if(f){d=d||0;for(var b=e.length;b>0&&e[b-1][2]>d;b--)e[b]=e[b-1];e[b]=[f,c,d];return}for(var t=1/0,b=0;b<e.length;b++){for(var[f,c,d]=e[b],r=!0,o=0;o<f.length;o++)(!1&d||t>=d)&&Object.keys(l.O).every(e=>l.O[e](f[o]))?f.splice(o--,1):(r=!1,d<t&&(t=d));if(r){e.splice(b--,1);var n=c();void 0!==n&&(a=n)}}return a},l.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return l.d(a,{a:a}),a},f=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,l.t=function(e,c){if(1&c&&(e=this(e)),8&c||"object"==typeof e&&e&&(4&c&&e.__esModule||16&c&&"function"==typeof e.then))return e;var d=Object.create(null);l.r(d);var b={};a=a||[null,f({}),f([]),f(f)];for(var t=2&c&&e;"object"==typeof t&&!~a.indexOf(t);t=f(t))Object.getOwnPropertyNames(t).forEach(a=>b[a]=()=>e[a]);return b.default=()=>e,l.d(d,b),d},l.d=(e,a)=>{for(var f in a)l.o(a,f)&&!l.o(e,f)&&Object.defineProperty(e,f,{enumerable:!0,get:a[f]})},l.f={},l.e=e=>Promise.all(Object.keys(l.f).reduce((a,f)=>(l.f[f](e,a),a),[])),l.u=e=>4986===e?"static/chunks/4986-c2fc8845ce785303.js":"static/chunks/"+(({535:"4ca0cff5",1290:"cee15710",1630:"53c1bd3f",2577:"d1c28714",3879:"cfdf2ac7",3888:"e868780c",4763:"4402d2ac",4814:"799ebd4e",6079:"363642f4",6666:"570e4624",6814:"7d29de82",7442:"92e53eb0",8835:"ce16f5a9",9312:"1cd6e1d3"})[e]||e)+"."+({10:"6cf001c181ce1098",34:"ce581867cf95e24b",36:"b4a553bf2106f6d3",194:"76dbdc07cdc2311d",214:"f6bba63dfa159e01",252:"a9e22657cbf67b42",327:"8ecab0b86d52b597",376:"9e742ff6919b2b54",392:"3cad93691f1b7360",400:"59979e0d3ae126e4",425:"9a3434a28926566a",535:"07efe2bc8f09d72e",541:"cfa15b606745131a",579:"33fc87fb95163c6a",583:"b3efc73cb21097e2",624:"2dd909fbfce98c5e",640:"5bf1e25d0bddf875",698:"e0dda03fd303b96b",794:"06b1ae4fc9cc10a9",816:"f909c891b91aa79f",830:"e49b226c07876df4",840:"a9c535f8868cc4bd",862:"fe3b86ecfb9c0716",893:"c469257bbbbca4f5",966:"57e4cd93c2368d34",968:"237f19aca13543fe",1078:"02294b2934d5bf21",1142:"8248bfb76c695146",1161:"06b33878b495da50",1184:"e80a999422621ed9",1188:"1d4ce94ddc297119",1198:"2a5c215f01a8b74d",1215:"88ed89521e915107",1219:"e27b0bd10b029e40",1247:"64e212daa5bb3925",1248:"36af3903f037c1f5",1274:"ce6906b1fe2e04b8",1280:"1651bb5167170457",1290:"869cef5f741d40c2",1335:"716cc5924662708e",1365:"d7391145ca7f8791",1379:"03e1e0f31bdaa2cc",1410:"77acea37535dbbef",1413:"117c5958c59cc695",1453:"3c24c777a3deca2d",1456:"217c3832b3e76b7f",1501:"549af2c91a889a08",1534:"918a25b2e3daab22",1556:"96abc9ff91b0c383",1583:"03a06dbdde85ac56",1595:"ee61519fde230f60",1630:"2911e2bac119d910",1642:"8c00543baa1aef54",1656:"a9efc78185a5a85f",1664:"6d5b5e3112b66906",1898:"e07b2b1c5e789b06",1932:"b0aea9b52cabe5e8",1977:"a06c8e8d2198f765",2008:"817d0885545aaea9",2013:"598558c40e51e107",2031:"3877441c49bff5cd",2041:"00f4fa0ab26c6ba5",2062:"4a0ab3400fea0e34",2107:"c627112b02b9e1c8",2130:"441ae0f68863efeb",2160:"e38d781fd5c4cde0",2179:"1bf5fe315e6e132c",2215:"9d2d6fbe90ffcc80",2278:"0b14de1cb2041bfd",2349:"ca15d465c4260b4b",2374:"7560cc5c4b8ed6b0",2397:"0e4dce0a557ac7cf",2403:"3dda71b6482dce3b",2485:"3188870375e9fbee",2489:"fcc70bd67329a70e",2501:"4e65b56602faa956",2503:"bb9d3528c3c7ccae",2504:"159b28843e61aae9",2577:"f52cffdd449a2d14",2614:"8349e4b407470a30",2710:"fe0656d4ebae4d30",2728:"5fed9ac13dfcd1d1",2735:"5a3e65a580bd5af9",2747:"1d85d388314f2904",2765:"2c6d9772af50feed",2783:"e8bbf2c794ef9750",2812:"dcd8179a6b1d76c9",2839:"c9a657d5b4031a19",2895:"0339e755e79ee794",2937:"7e724516d5e6ce42",2954:"7d8daeae6410d4a4",2957:"2dd93db1a16e96b0",2964:"1a0e15f7327680a2",3072:"b6da96c10080c967",3074:"911584369786c26c",3077:"bf82c0c332cc9fec",3082:"159e4ab8f0572597",3095:"8cd478c42cee505a",3111:"1cf85db2faeb20cc",3175:"538ce7aec634bddb",3186:"3665756f8aae3eb7",3194:"5a331fb5e3dc34e9",3229:"5e91f7d0b135266b",3274:"858f7f9216c8b074",3286:"196c508356bb0b66",3288:"f23c8a5183e6b910",3290:"b5ba2646ad49c9fd",3304:"16305e84f4ff6598",3313:"471138e5504646a9",3324:"85e21e3313d0901c",3392:"460f5a753531f501",3419:"78b520dab7e2f96d",3437:"0ad1ecc8c5b8a679",3476:"246c30b47bded3b7",3483:"fc2a0b1185dbaa5d",3492:"ca55498822ad7796",3526:"24826331ab265b39",3606:"e5c833cdda239583",3633:"2526b2d018636ff0",3782:"8d7b66d0e37dbe76",3787:"78ebe68a043f50ce",3860:"be5b243bf7d6618c",3873:"72a9a21509f713f7",3879:"f50abf4e93e943ea",3888:"f7831045ac345aaa",3942:"085da8d58242eeab",3979:"cea8623f6e9f83ea",4053:"90d71fcbe4ffd852",4080:"08a21dae9e93c547",4163:"c6ebefdd9aa5c358",4174:"b6ff75dd91a2a32e",4223:"c10556cd92fc8018",4242:"3a66c58375424a5b",4275:"8f2e531757c2a813",4295:"6c0f4838b0c9c69d",4309:"a887a10e84c44f9e",4350:"b9d80827e8eee01a",4357:"ac4f251cdac34fbe",4358:"f89b14cf7a988731",4370:"ac13b62c811f7ede",4417:"0b5ee948c3518db3",4447:"f86b52aea068b189",4474:"053807fa34066566",4539:"559c223da16b0282",4540:"03df20c499bca840",4553:"ce3eab65a260353e",4567:"7dc81a6e1c7df565",4583:"2a5df6eb3a6ea30b",4593:"676ac488744e1af5",4608:"1ff246d6b4c771f8",4634:"0332a56fdb8e26c0",4650:"61aec912b756287b",4659:"0b14de1cb2041bfd",4678:"867dfae26694be02",4763:"d0d1b1777a45e0b2",4801:"17596dbc1818c262",4814:"ccb85c56e9216a38",4823:"907850963b2bcb70",4829:"402ec60139d36417",4846:"c563765de65a34c7",4900:"b723a916eafdf743",4903:"004f583a12223dac",4963:"0f6678151a159143",4969:"1cb10af9489ea295",4976:"8870319ffbd1c31f",5005:"73745d7fcae6989e",5025:"b597364f0cf8b85a",5061:"025d30c3123eeaf6",5136:"ac897c2a56ee392f",5183:"2e5c895a2be76262",5269:"2e771096652dc113",5320:"00f00028b9163a43",5326:"adc4bf49a22f4e67",5331:"4d5d42e5253dbee2",5347:"3192e0021174aaa8",5375:"ebc026e6140b52f1",5424:"4d62f7ee887cd8b9",5482:"0907421e6bf5eeec",5491:"5cc285c4b84dac30",5498:"117ef4b6035a90c5",5518:"6c3dc9afe81a566b",5520:"eab85d7487e77510",5553:"75df19e3cc1246d6",5575:"3d90c643343a1329",5645:"0b86853ae26d9ee3",5670:"2a1b27a6fdb7aa6b",5690:"d30877807cf5c7eb",5712:"574fca2d5f06483a",5728:"8ef773d61765855e",5750:"aa57d25b74640d23",5755:"00015c284ed6fb39",5920:"9db223329ee9e11a",5922:"ce56021f8cc6ebbc",5937:"0827b5b3eb831ff0",5968:"63d5869783fad06f",5997:"226c07d9e6c496e0",6046:"00d36aea7fd5b147",6079:"f9053a63f1b97508",6089:"2dd351186ec85cc3",6099:"43e6595fcf24fc33",6110:"5ce3f75fced27aaf",6144:"f967a8228bcdf663",6155:"19719cff570d6559",6166:"ecd82a9dcb484b97",6290:"e14cf4fc52dd4539",6293:"5914fa73a9f7e777",6311:"5b9c1f74df9a8f67",6331:"758f2f66b92cada9",6339:"bc9301cc22898be0",6360:"ff0a9063773daeeb",6402:"a0070d7688ed986b",6412:"089ee787a294d10b",6455:"12b78a2660d609eb",6502:"b804e48b7919f55e",6563:"5d618b608750f4dc",6572:"ca2463823b9b01a0",6580:"75d53830b434451f",6588:"0fbca957af7d9e6a",6647:"584c5d5cd8dfdb5a",6666:"a82467c542429379",6686:"796c782c33ab8ca9",6701:"bff0efb979f71a17",6704:"f280f0ad0f5d8644",6729:"77a5381ac8f5c9ae",6741:"06fdaf122961074e",6814:"30ff86a90cbfd921",6846:"91283f709c40802c",6859:"bacad166ee995fe0",6887:"6c81234d73740fb9",6927:"aa3914b5fb0d14d4",6931:"3c90e9fe0f7f1e66",6938:"0ccf683bd8aa8410",6948:"2719ed8731963209",6959:"5a803faf27f88e9f",7021:"b71240b1d5f6fbe4",7040:"0b14de1cb2041bfd",7041:"174bf29bd837f06d",7082:"fc816f91214026d7",7113:"39704408fef3d26e",7130:"8d24694735826c22",7142:"dbd2cf8141eece5e",7152:"c7b7f1f5e9622f21",7227:"a6b2f01487bb3d9d",7258:"6cbe24c3bcb63d1d",7425:"8b47c8e398a12dd8",7442:"097194be4a0e7d55",7455:"71d54397710b923c",7465:"867e8ff655666413",7524:"9528295a19a5837a",7525:"f433aaf1fe40c90a",7557:"bdc743175125b3d8",7610:"b1439345dbcf285d",7625:"ab66bd50d2fb61a4",7635:"166d83de1d29e758",7636:"bf91320a9ff695af",7785:"1402a4110c300764",7799:"40b047a634f96a24",7819:"3c56f48c0dc5ad5d",7844:"2bb29faa262f313e",7846:"c9705c044ab8f87a",7884:"390ae2efbbf230c4",7889:"af3e581842f34c28",7921:"c361f794cc208e06",7977:"80e4daa080a79c39",8113:"907baefc7227cfb8",8132:"74491162f08af899",8192:"5918d83ac6a0e2dc",8243:"1450514f8390977e",8257:"dd8f651f1a43fee2",8288:"9bd1d26060cb00a1",8318:"81c7ac586fcbb728",8406:"955ccfbb4b70b8c3",8430:"b1f802dcffa41626",8432:"bd66ac287c569996",8457:"b61d96d8d30215fc",8496:"046efd6301dd804f",8545:"be0c9eea6aae5971",8555:"ab3ee6358f1d64da",8656:"2ceb4e5ff5df2fca",8670:"90ede75068758e82",8704:"a1003918da6654da",8773:"614f1f4f0f845c5e",8835:"5c7821b201f35593",8848:"7c6e47cca9f0059a",8921:"fb24a4d4d4d3265b",8947:"31d3d834d8281fd9",8977:"01b9c429327004e9",9005:"33cf91e617920d4f",9006:"11537833945ec4b8",9015:"c4e40321a6503a1b",9136:"191be42a2fee842c",9178:"48a90097ee3f0b0c",9186:"3af6fcd13ab752fa",9189:"3e9d29bf275ec462",9220:"bc767ebb5adb9f49",9224:"401f9320ee58570b",9240:"d38ddbe94e0bf128",9267:"fbfd65ea31e7448c",9294:"a20485f3282321b3",9302:"726b065f2df0323a",9312:"8121a74b2042bff3",9377:"f9db706e76f04afe",9382:"bc0e11ecc88dd62c",9421:"a5c1dbcfbfdd8f52",9448:"2668b3cd408e86de",9466:"c9d8f45d14235087",9521:"e1240eb862eb32dc",9547:"7729788fff21926f",9565:"8de0671f99d12abe",9569:"2f36b2b1c2f838d7",9605:"dfac539f89cea7a2",9615:"3b62c13af671f714",9648:"8235b6fea7087b3a",9666:"a515fa6d89a71f1c",9680:"d5ceac8967e0b6a8",9690:"7773c72f0eff6dec",9841:"422321143547591a",9842:"3b71b65b30d8ef2a",9996:"18b7bca2f0ab222e"})[e]+".js",l.miniCssF=e=>"static/css/659eccb5db697b76.css",l.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||Function("return this")()}catch(e){if("object"==typeof window)return window}}(),l.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),c={},l.l=(e,a,f,d)=>{if(c[e])return void c[e].push(a);if(void 0!==f)for(var b,t,r=document.getElementsByTagName("script"),o=0;o<r.length;o++){var n=r[o];if(n.getAttribute("src")==e||n.getAttribute("data-webpack")=="_N_E:"+f){b=n;break}}b||(t=!0,(b=document.createElement("script")).charset="utf-8",b.timeout=120,l.nc&&b.setAttribute("nonce",l.nc),b.setAttribute("data-webpack","_N_E:"+f),b.src=l.tu(e)),c[e]=[a];var i=(a,f)=>{b.onerror=b.onload=null,clearTimeout(u);var d=c[e];if(delete c[e],b.parentNode&&b.parentNode.removeChild(b),d&&d.forEach(e=>e(f)),a)return a(f)},u=setTimeout(i.bind(null,void 0,{type:"timeout",target:b}),12e4);b.onerror=i.bind(null,b.onerror),b.onload=i.bind(null,b.onload),t&&document.head.appendChild(b)},l.r=e=>{"u">typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},l.tt=()=>(void 0===d&&(d={createScriptURL:e=>e},"u">typeof trustedTypes&&trustedTypes.createPolicy&&(d=trustedTypes.createPolicy("nextjs#bundler",d))),d),l.tu=e=>l.tt().createScriptURL(e),l.p="/_next/",b={8068:0},l.f.miniCss=(e,a)=>{if(b[e])a.push(b[e]);else 0!==b[e]&&({1838:1})[e]&&a.push(b[e]=new Promise((a,f)=>{var c,d=l.miniCssF(e),b=l.p+d;if(((e,a)=>{for(var f=document.getElementsByTagName("link"),c=0;c<f.length;c++){var d=f[c],b=d.getAttribute("data-href")||d.getAttribute("href");if("stylesheet"===d.rel&&(b===e||b===a))return d}for(var t=document.getElementsByTagName("style"),c=0;c<t.length;c++){var d=t[c],b=d.getAttribute("data-href");if(b===e||b===a)return d}})(d,b))return a();(c=document.createElement("link")).rel="stylesheet",c.type="text/css",c.onerror=c.onload=d=>{if(c.onerror=c.onload=null,"load"===d.type)a();else{var t=d&&("load"===d.type?"missing":d.type),r=d&&d.target&&d.target.href||b,o=Error("Loading CSS chunk "+e+" failed.\n("+r+")");o.code="CSS_CHUNK_LOAD_FAILED",o.type=t,o.request=r,c.parentNode.removeChild(c),f(o)}},c.href=b,function(e){if("function"==typeof _N_E_STYLE_LOAD){let{href:a,onload:f,onerror:c}=e;_N_E_STYLE_LOAD(0===a.indexOf(window.location.origin)?new URL(a).pathname:a).then(()=>null==f?void 0:f.call(e,{type:"load"}),()=>null==c?void 0:c.call(e,{}))}else document.head.appendChild(e)}(c)}).then(()=>{b[e]=0},a=>{throw delete b[e],a}))},t={8068:0,2557:0,7513:0},l.f.j=(e,a)=>{var f=l.o(t,e)?t[e]:void 0;if(0!==f)if(f)a.push(f[2]);else if(/^(1838|2557|7513|8068)$/.test(e))t[e]=0;else{var c=new Promise((a,c)=>f=t[e]=[a,c]);a.push(f[2]=c);var d=l.p+l.u(e),b=Error();l.l(d,a=>{if(l.o(t,e)&&(0!==(f=t[e])&&(t[e]=void 0),f)){var c=a&&("load"===a.type?"missing":a.type),d=a&&a.target&&a.target.src;b.message="Loading chunk "+e+" failed.\n("+c+": "+d+")",b.name="ChunkLoadError",b.type=c,b.request=d,f[1](b)}},"chunk-"+e,e)}},l.O.j=e=>0===t[e],r=(e,a)=>{var f,c,[d,b,r]=a,o=0;if(d.some(e=>0!==t[e])){for(f in b)l.o(b,f)&&(l.m[f]=b[f]);if(r)var n=r(l)}for(e&&e(a);o<d.length;o++)c=d[o],l.o(t,c)&&t[c]&&t[c][0](),t[c]=0;return l.O(n)},(o=self.webpackChunk_N_E=self.webpackChunk_N_E||[]).forEach(r.bind(null,0)),o.push=r.bind(null,o.push.bind(o)),l.nc=void 0})();
|
|
1
|
+
(()=>{"use strict";var e,a,f,c,d,b,t,r,o,n={},i={};function l(e){var a=i[e];if(void 0!==a)return a.exports;var f=i[e]={exports:{}},c=!0;try{n[e].call(f.exports,f,f.exports,l),c=!1}finally{c&&delete i[e]}return f.exports}l.m=n,e=[],l.O=(a,f,c,d)=>{if(f){d=d||0;for(var b=e.length;b>0&&e[b-1][2]>d;b--)e[b]=e[b-1];e[b]=[f,c,d];return}for(var t=1/0,b=0;b<e.length;b++){for(var[f,c,d]=e[b],r=!0,o=0;o<f.length;o++)(!1&d||t>=d)&&Object.keys(l.O).every(e=>l.O[e](f[o]))?f.splice(o--,1):(r=!1,d<t&&(t=d));if(r){e.splice(b--,1);var n=c();void 0!==n&&(a=n)}}return a},l.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return l.d(a,{a:a}),a},f=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,l.t=function(e,c){if(1&c&&(e=this(e)),8&c||"object"==typeof e&&e&&(4&c&&e.__esModule||16&c&&"function"==typeof e.then))return e;var d=Object.create(null);l.r(d);var b={};a=a||[null,f({}),f([]),f(f)];for(var t=2&c&&e;"object"==typeof t&&!~a.indexOf(t);t=f(t))Object.getOwnPropertyNames(t).forEach(a=>b[a]=()=>e[a]);return b.default=()=>e,l.d(d,b),d},l.d=(e,a)=>{for(var f in a)l.o(a,f)&&!l.o(e,f)&&Object.defineProperty(e,f,{enumerable:!0,get:a[f]})},l.f={},l.e=e=>Promise.all(Object.keys(l.f).reduce((a,f)=>(l.f[f](e,a),a),[])),l.u=e=>4986===e?"static/chunks/4986-c2fc8845ce785303.js":"static/chunks/"+(({535:"4ca0cff5",1290:"cee15710",1630:"53c1bd3f",2577:"d1c28714",3879:"cfdf2ac7",3888:"e868780c",4763:"4402d2ac",4814:"799ebd4e",6079:"363642f4",6666:"570e4624",6814:"7d29de82",7442:"92e53eb0",8835:"ce16f5a9",9312:"1cd6e1d3"})[e]||e)+"."+({10:"6cf001c181ce1098",34:"ce581867cf95e24b",36:"b4a553bf2106f6d3",194:"76dbdc07cdc2311d",214:"f6bba63dfa159e01",252:"a9e22657cbf67b42",327:"8ecab0b86d52b597",376:"9e742ff6919b2b54",392:"3cad93691f1b7360",400:"59979e0d3ae126e4",425:"9a3434a28926566a",535:"07efe2bc8f09d72e",541:"cfa15b606745131a",579:"33fc87fb95163c6a",583:"b3efc73cb21097e2",624:"2dd909fbfce98c5e",640:"5bf1e25d0bddf875",698:"e0dda03fd303b96b",794:"06b1ae4fc9cc10a9",816:"f909c891b91aa79f",830:"e49b226c07876df4",840:"a9c535f8868cc4bd",862:"fe3b86ecfb9c0716",893:"c469257bbbbca4f5",966:"57e4cd93c2368d34",968:"237f19aca13543fe",1078:"02294b2934d5bf21",1142:"8248bfb76c695146",1161:"06b33878b495da50",1184:"e80a999422621ed9",1188:"1d4ce94ddc297119",1198:"2a5c215f01a8b74d",1215:"88ed89521e915107",1219:"e27b0bd10b029e40",1247:"64e212daa5bb3925",1248:"36af3903f037c1f5",1274:"ce6906b1fe2e04b8",1280:"1651bb5167170457",1290:"869cef5f741d40c2",1335:"716cc5924662708e",1365:"d7391145ca7f8791",1379:"03e1e0f31bdaa2cc",1410:"77acea37535dbbef",1413:"117c5958c59cc695",1453:"3c24c777a3deca2d",1456:"217c3832b3e76b7f",1501:"549af2c91a889a08",1534:"918a25b2e3daab22",1556:"96abc9ff91b0c383",1583:"03a06dbdde85ac56",1595:"ee61519fde230f60",1630:"2911e2bac119d910",1642:"8c00543baa1aef54",1656:"a9efc78185a5a85f",1664:"6d5b5e3112b66906",1898:"e07b2b1c5e789b06",1932:"b0aea9b52cabe5e8",1977:"a06c8e8d2198f765",2008:"817d0885545aaea9",2013:"598558c40e51e107",2031:"3877441c49bff5cd",2041:"00f4fa0ab26c6ba5",2062:"4a0ab3400fea0e34",2107:"c627112b02b9e1c8",2130:"441ae0f68863efeb",2160:"e38d781fd5c4cde0",2179:"1bf5fe315e6e132c",2215:"9d2d6fbe90ffcc80",2278:"0b14de1cb2041bfd",2349:"ca15d465c4260b4b",2374:"7560cc5c4b8ed6b0",2397:"0e4dce0a557ac7cf",2403:"3dda71b6482dce3b",2485:"3188870375e9fbee",2489:"fcc70bd67329a70e",2501:"4e65b56602faa956",2503:"bb9d3528c3c7ccae",2504:"159b28843e61aae9",2577:"f52cffdd449a2d14",2614:"8349e4b407470a30",2710:"fe0656d4ebae4d30",2728:"5fed9ac13dfcd1d1",2735:"5a3e65a580bd5af9",2747:"1d85d388314f2904",2765:"2c6d9772af50feed",2783:"e8bbf2c794ef9750",2812:"dcd8179a6b1d76c9",2839:"c9a657d5b4031a19",2895:"0339e755e79ee794",2937:"7e724516d5e6ce42",2954:"7d8daeae6410d4a4",2957:"2dd93db1a16e96b0",2964:"1a0e15f7327680a2",3072:"b6da96c10080c967",3074:"911584369786c26c",3077:"bf82c0c332cc9fec",3082:"159e4ab8f0572597",3095:"8cd478c42cee505a",3111:"1cf85db2faeb20cc",3175:"538ce7aec634bddb",3186:"3665756f8aae3eb7",3194:"5a331fb5e3dc34e9",3229:"5e91f7d0b135266b",3274:"858f7f9216c8b074",3286:"196c508356bb0b66",3288:"f23c8a5183e6b910",3290:"b5ba2646ad49c9fd",3304:"16305e84f4ff6598",3313:"471138e5504646a9",3324:"85e21e3313d0901c",3392:"460f5a753531f501",3419:"78b520dab7e2f96d",3437:"0ad1ecc8c5b8a679",3476:"246c30b47bded3b7",3483:"fc2a0b1185dbaa5d",3492:"ca55498822ad7796",3526:"24826331ab265b39",3606:"e5c833cdda239583",3633:"2526b2d018636ff0",3782:"8d7b66d0e37dbe76",3787:"78ebe68a043f50ce",3860:"be5b243bf7d6618c",3873:"72a9a21509f713f7",3879:"f50abf4e93e943ea",3888:"f7831045ac345aaa",3942:"085da8d58242eeab",3979:"cea8623f6e9f83ea",4053:"90d71fcbe4ffd852",4080:"08a21dae9e93c547",4163:"c6ebefdd9aa5c358",4174:"b6ff75dd91a2a32e",4223:"c10556cd92fc8018",4242:"3a66c58375424a5b",4275:"8f2e531757c2a813",4295:"6c0f4838b0c9c69d",4309:"a887a10e84c44f9e",4350:"b9d80827e8eee01a",4357:"ac4f251cdac34fbe",4358:"f89b14cf7a988731",4370:"ac13b62c811f7ede",4417:"0b5ee948c3518db3",4447:"f86b52aea068b189",4474:"053807fa34066566",4539:"559c223da16b0282",4540:"03df20c499bca840",4553:"ce3eab65a260353e",4567:"7dc81a6e1c7df565",4583:"2a5df6eb3a6ea30b",4593:"676ac488744e1af5",4608:"1ff246d6b4c771f8",4634:"0332a56fdb8e26c0",4650:"61aec912b756287b",4659:"0b14de1cb2041bfd",4678:"867dfae26694be02",4763:"d0d1b1777a45e0b2",4801:"17596dbc1818c262",4814:"ccb85c56e9216a38",4823:"907850963b2bcb70",4829:"402ec60139d36417",4846:"c563765de65a34c7",4900:"b723a916eafdf743",4903:"004f583a12223dac",4963:"0f6678151a159143",4969:"1cb10af9489ea295",4976:"8870319ffbd1c31f",5005:"73745d7fcae6989e",5025:"b597364f0cf8b85a",5061:"025d30c3123eeaf6",5136:"ac897c2a56ee392f",5183:"2e5c895a2be76262",5269:"2e771096652dc113",5320:"00f00028b9163a43",5326:"adc4bf49a22f4e67",5331:"4d5d42e5253dbee2",5347:"3192e0021174aaa8",5375:"ebc026e6140b52f1",5424:"4d62f7ee887cd8b9",5482:"0907421e6bf5eeec",5491:"5cc285c4b84dac30",5498:"117ef4b6035a90c5",5518:"6c3dc9afe81a566b",5520:"eab85d7487e77510",5553:"75df19e3cc1246d6",5575:"3d90c643343a1329",5645:"0b86853ae26d9ee3",5670:"2a1b27a6fdb7aa6b",5690:"d30877807cf5c7eb",5712:"574fca2d5f06483a",5728:"8ef773d61765855e",5750:"aa57d25b74640d23",5755:"00015c284ed6fb39",5920:"9db223329ee9e11a",5922:"ce56021f8cc6ebbc",5937:"0827b5b3eb831ff0",5968:"63d5869783fad06f",5997:"226c07d9e6c496e0",6046:"00d36aea7fd5b147",6079:"f9053a63f1b97508",6089:"2dd351186ec85cc3",6099:"43e6595fcf24fc33",6110:"5ce3f75fced27aaf",6144:"f967a8228bcdf663",6155:"19719cff570d6559",6166:"ecd82a9dcb484b97",6290:"e14cf4fc52dd4539",6293:"5914fa73a9f7e777",6311:"5b9c1f74df9a8f67",6331:"758f2f66b92cada9",6339:"bc9301cc22898be0",6360:"ff0a9063773daeeb",6402:"a0070d7688ed986b",6412:"089ee787a294d10b",6455:"12b78a2660d609eb",6502:"8874bcae249c02e1",6563:"5d618b608750f4dc",6572:"ca2463823b9b01a0",6580:"75d53830b434451f",6588:"0fbca957af7d9e6a",6647:"584c5d5cd8dfdb5a",6666:"a82467c542429379",6686:"796c782c33ab8ca9",6701:"bff0efb979f71a17",6704:"f280f0ad0f5d8644",6729:"77a5381ac8f5c9ae",6741:"06fdaf122961074e",6814:"30ff86a90cbfd921",6846:"91283f709c40802c",6859:"bacad166ee995fe0",6887:"6c81234d73740fb9",6927:"aa3914b5fb0d14d4",6931:"3c90e9fe0f7f1e66",6938:"0ccf683bd8aa8410",6948:"2719ed8731963209",6959:"5a803faf27f88e9f",7021:"b71240b1d5f6fbe4",7040:"0b14de1cb2041bfd",7041:"174bf29bd837f06d",7082:"fc816f91214026d7",7113:"39704408fef3d26e",7130:"8d24694735826c22",7142:"dbd2cf8141eece5e",7152:"c7b7f1f5e9622f21",7227:"a6b2f01487bb3d9d",7258:"6cbe24c3bcb63d1d",7425:"8b47c8e398a12dd8",7442:"097194be4a0e7d55",7455:"71d54397710b923c",7465:"867e8ff655666413",7524:"9528295a19a5837a",7525:"f433aaf1fe40c90a",7557:"bdc743175125b3d8",7610:"b1439345dbcf285d",7625:"ab66bd50d2fb61a4",7635:"166d83de1d29e758",7636:"bf91320a9ff695af",7785:"1402a4110c300764",7799:"40b047a634f96a24",7819:"3c56f48c0dc5ad5d",7844:"2bb29faa262f313e",7846:"c9705c044ab8f87a",7884:"390ae2efbbf230c4",7889:"af3e581842f34c28",7921:"c361f794cc208e06",7977:"80e4daa080a79c39",8113:"907baefc7227cfb8",8132:"74491162f08af899",8192:"5918d83ac6a0e2dc",8243:"1450514f8390977e",8257:"dd8f651f1a43fee2",8288:"9bd1d26060cb00a1",8318:"81c7ac586fcbb728",8406:"955ccfbb4b70b8c3",8430:"b1f802dcffa41626",8432:"bd66ac287c569996",8457:"b61d96d8d30215fc",8496:"046efd6301dd804f",8545:"be0c9eea6aae5971",8555:"ab3ee6358f1d64da",8656:"2ceb4e5ff5df2fca",8670:"90ede75068758e82",8704:"a1003918da6654da",8773:"614f1f4f0f845c5e",8835:"5c7821b201f35593",8848:"7c6e47cca9f0059a",8921:"fb24a4d4d4d3265b",8947:"31d3d834d8281fd9",8977:"01b9c429327004e9",9005:"33cf91e617920d4f",9006:"11537833945ec4b8",9015:"c4e40321a6503a1b",9136:"191be42a2fee842c",9178:"48a90097ee3f0b0c",9186:"3af6fcd13ab752fa",9189:"3e9d29bf275ec462",9220:"bc767ebb5adb9f49",9224:"401f9320ee58570b",9240:"d38ddbe94e0bf128",9267:"fbfd65ea31e7448c",9294:"a20485f3282321b3",9302:"726b065f2df0323a",9312:"8121a74b2042bff3",9377:"f9db706e76f04afe",9382:"bc0e11ecc88dd62c",9421:"a5c1dbcfbfdd8f52",9448:"2668b3cd408e86de",9466:"c9d8f45d14235087",9521:"e1240eb862eb32dc",9547:"7729788fff21926f",9565:"8de0671f99d12abe",9569:"2f36b2b1c2f838d7",9605:"dfac539f89cea7a2",9615:"3b62c13af671f714",9648:"8235b6fea7087b3a",9666:"a515fa6d89a71f1c",9680:"d5ceac8967e0b6a8",9690:"7773c72f0eff6dec",9841:"422321143547591a",9842:"3b71b65b30d8ef2a",9996:"18b7bca2f0ab222e"})[e]+".js",l.miniCssF=e=>"static/css/659eccb5db697b76.css",l.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||Function("return this")()}catch(e){if("object"==typeof window)return window}}(),l.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),c={},l.l=(e,a,f,d)=>{if(c[e])return void c[e].push(a);if(void 0!==f)for(var b,t,r=document.getElementsByTagName("script"),o=0;o<r.length;o++){var n=r[o];if(n.getAttribute("src")==e||n.getAttribute("data-webpack")=="_N_E:"+f){b=n;break}}b||(t=!0,(b=document.createElement("script")).charset="utf-8",b.timeout=120,l.nc&&b.setAttribute("nonce",l.nc),b.setAttribute("data-webpack","_N_E:"+f),b.src=l.tu(e)),c[e]=[a];var i=(a,f)=>{b.onerror=b.onload=null,clearTimeout(u);var d=c[e];if(delete c[e],b.parentNode&&b.parentNode.removeChild(b),d&&d.forEach(e=>e(f)),a)return a(f)},u=setTimeout(i.bind(null,void 0,{type:"timeout",target:b}),12e4);b.onerror=i.bind(null,b.onerror),b.onload=i.bind(null,b.onload),t&&document.head.appendChild(b)},l.r=e=>{"u">typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},l.tt=()=>(void 0===d&&(d={createScriptURL:e=>e},"u">typeof trustedTypes&&trustedTypes.createPolicy&&(d=trustedTypes.createPolicy("nextjs#bundler",d))),d),l.tu=e=>l.tt().createScriptURL(e),l.p="/_next/",b={8068:0},l.f.miniCss=(e,a)=>{if(b[e])a.push(b[e]);else 0!==b[e]&&({1838:1})[e]&&a.push(b[e]=new Promise((a,f)=>{var c,d=l.miniCssF(e),b=l.p+d;if(((e,a)=>{for(var f=document.getElementsByTagName("link"),c=0;c<f.length;c++){var d=f[c],b=d.getAttribute("data-href")||d.getAttribute("href");if("stylesheet"===d.rel&&(b===e||b===a))return d}for(var t=document.getElementsByTagName("style"),c=0;c<t.length;c++){var d=t[c],b=d.getAttribute("data-href");if(b===e||b===a)return d}})(d,b))return a();(c=document.createElement("link")).rel="stylesheet",c.type="text/css",c.onerror=c.onload=d=>{if(c.onerror=c.onload=null,"load"===d.type)a();else{var t=d&&("load"===d.type?"missing":d.type),r=d&&d.target&&d.target.href||b,o=Error("Loading CSS chunk "+e+" failed.\n("+r+")");o.code="CSS_CHUNK_LOAD_FAILED",o.type=t,o.request=r,c.parentNode.removeChild(c),f(o)}},c.href=b,function(e){if("function"==typeof _N_E_STYLE_LOAD){let{href:a,onload:f,onerror:c}=e;_N_E_STYLE_LOAD(0===a.indexOf(window.location.origin)?new URL(a).pathname:a).then(()=>null==f?void 0:f.call(e,{type:"load"}),()=>null==c?void 0:c.call(e,{}))}else document.head.appendChild(e)}(c)}).then(()=>{b[e]=0},a=>{throw delete b[e],a}))},t={8068:0,2557:0,7513:0},l.f.j=(e,a)=>{var f=l.o(t,e)?t[e]:void 0;if(0!==f)if(f)a.push(f[2]);else if(/^(1838|2557|7513|8068)$/.test(e))t[e]=0;else{var c=new Promise((a,c)=>f=t[e]=[a,c]);a.push(f[2]=c);var d=l.p+l.u(e),b=Error();l.l(d,a=>{if(l.o(t,e)&&(0!==(f=t[e])&&(t[e]=void 0),f)){var c=a&&("load"===a.type?"missing":a.type),d=a&&a.target&&a.target.src;b.message="Loading chunk "+e+" failed.\n("+c+": "+d+")",b.name="ChunkLoadError",b.type=c,b.request=d,f[1](b)}},"chunk-"+e,e)}},l.O.j=e=>0===t[e],r=(e,a)=>{var f,c,[d,b,r]=a,o=0;if(d.some(e=>0!==t[e])){for(f in b)l.o(b,f)&&(l.m[f]=b[f]);if(r)var n=r(l)}for(e&&e(a);o<d.length;o++)c=d[o],l.o(t,c)&&t[c]&&t[c][0](),t[c]=0;return l.O(n)},(o=self.webpackChunk_N_E=self.webpackChunk_N_E||[]).forEach(r.bind(null,0)),o.push=r.bind(null,o.push.bind(o)),l.nc=void 0})();
|
package/package.json
CHANGED
|
@@ -15,7 +15,7 @@ export interface GsdCommandDefinition {
|
|
|
15
15
|
type CompletionMap = Record<string, readonly GsdCommandDefinition[]>;
|
|
16
16
|
|
|
17
17
|
export const GSD_COMMAND_DESCRIPTION =
|
|
18
|
-
"GSD — Get Shit Done: /gsd help|start|templates|next|auto|stop|pause|status|widget|visualize|queue|quick|discuss|capture|triage|dispatch|history|undo|undo-task|reset-slice|rate|skip|export|cleanup|
|
|
18
|
+
"GSD — Get Shit Done: /gsd help|start|templates|next|auto|stop|pause|status|widget|visualize|queue|quick|discuss|capture|triage|dispatch|history|undo|undo-task|reset-slice|rate|skip|export|cleanup|mode|prefs|config|keys|hooks|run-hook|skill-health|doctor|logs|forensics|changelog|migrate|remote|steer|knowledge|new-milestone|parallel|cmux|park|unpark|init|setup|inspect|extensions|update|fast|mcp|rethink|codebase|notifications";
|
|
19
19
|
|
|
20
20
|
export const TOP_LEVEL_SUBCOMMANDS: readonly GsdCommandDefinition[] = [
|
|
21
21
|
{ cmd: "help", desc: "Categorized command reference with descriptions" },
|
|
@@ -41,7 +41,6 @@ export const TOP_LEVEL_SUBCOMMANDS: readonly GsdCommandDefinition[] = [
|
|
|
41
41
|
{ cmd: "skip", desc: "Prevent a unit from auto-mode dispatch" },
|
|
42
42
|
{ cmd: "export", desc: "Export milestone/slice results" },
|
|
43
43
|
{ cmd: "cleanup", desc: "Remove merged branches or snapshots" },
|
|
44
|
-
{ cmd: "model", desc: "Switch the active session model or open a picker" },
|
|
45
44
|
{ cmd: "mode", desc: "Switch workflow mode (solo/team)" },
|
|
46
45
|
{ cmd: "prefs", desc: "Manage preferences (model selection, timeouts, etc.)" },
|
|
47
46
|
{ cmd: "config", desc: "Set API keys for external tools" },
|
|
@@ -14,7 +14,7 @@ export async function handleGSDCommand(
|
|
|
14
14
|
const trimmed = (typeof args === "string" ? args : "").trim();
|
|
15
15
|
|
|
16
16
|
const handlers = [
|
|
17
|
-
() => handleCoreCommand(trimmed, ctx
|
|
17
|
+
() => handleCoreCommand(trimmed, ctx),
|
|
18
18
|
() => handleAutoCommand(trimmed, ctx, pi),
|
|
19
19
|
() => handleParallelCommand(trimmed, ctx, pi),
|
|
20
20
|
() => handleWorkflowCommand(trimmed, ctx, pi),
|
|
@@ -29,3 +29,4 @@ export async function handleGSDCommand(
|
|
|
29
29
|
|
|
30
30
|
ctx.ui.notify(`Unknown: /gsd ${trimmed}. Run /gsd help for available commands.`, "warning");
|
|
31
31
|
}
|
|
32
|
+
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type { Model } from "@gsd/pi-ai";
|
|
1
|
+
import type { ExtensionCommandContext, ExtensionContext } from "@gsd/pi-coding-agent";
|
|
3
2
|
import type { GSDState } from "../../types.js";
|
|
4
3
|
|
|
5
4
|
import { computeProgressScore, formatProgressLine } from "../../progress-score.js";
|
|
@@ -49,7 +48,6 @@ export function showHelp(ctx: ExtensionCommandContext): void {
|
|
|
49
48
|
"SETUP & CONFIGURATION",
|
|
50
49
|
" /gsd init Project init wizard — detect, configure, bootstrap .gsd/",
|
|
51
50
|
" /gsd setup Global setup status [llm|search|remote|keys|prefs]",
|
|
52
|
-
" /gsd model Switch active session model [provider/model|model-id]",
|
|
53
51
|
" /gsd mode Set workflow mode (solo/team) [global|project]",
|
|
54
52
|
" /gsd prefs Manage preferences [global|project|status|wizard|setup|import-claude]",
|
|
55
53
|
" /gsd cmux Manage cmux integration [status|on|off|notifications|sidebar|splits|browser]",
|
|
@@ -181,106 +179,7 @@ export async function handleSetup(args: string, ctx: ExtensionCommandContext): P
|
|
|
181
179
|
);
|
|
182
180
|
}
|
|
183
181
|
|
|
184
|
-
function
|
|
185
|
-
return [...models].sort((a, b) => {
|
|
186
|
-
const aCurrent = currentModel && a.provider === currentModel.provider && a.id === currentModel.id;
|
|
187
|
-
const bCurrent = currentModel && b.provider === currentModel.provider && b.id === currentModel.id;
|
|
188
|
-
if (aCurrent && !bCurrent) return -1;
|
|
189
|
-
if (!aCurrent && bCurrent) return 1;
|
|
190
|
-
const providerCmp = a.provider.localeCompare(b.provider);
|
|
191
|
-
if (providerCmp !== 0) return providerCmp;
|
|
192
|
-
return a.id.localeCompare(b.id);
|
|
193
|
-
});
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
async function resolveRequestedModel(
|
|
197
|
-
query: string,
|
|
198
|
-
ctx: ExtensionCommandContext,
|
|
199
|
-
): Promise<Model<any> | undefined> {
|
|
200
|
-
const { resolveModelId } = await import("../../auto-model-selection.js");
|
|
201
|
-
const models = ctx.modelRegistry.getAvailable();
|
|
202
|
-
const exact = resolveModelId(query, models, ctx.model?.provider);
|
|
203
|
-
if (exact) return exact;
|
|
204
|
-
|
|
205
|
-
const lowerQuery = query.toLowerCase();
|
|
206
|
-
const partialMatches = models.filter((model) =>
|
|
207
|
-
model.id.toLowerCase().includes(lowerQuery)
|
|
208
|
-
|| `${model.provider}/${model.id}`.toLowerCase().includes(lowerQuery),
|
|
209
|
-
);
|
|
210
|
-
|
|
211
|
-
if (partialMatches.length === 1) return partialMatches[0];
|
|
212
|
-
if (partialMatches.length === 0 || !ctx.hasUI) return undefined;
|
|
213
|
-
|
|
214
|
-
const sorted = sortModelsForSelection(partialMatches, ctx.model);
|
|
215
|
-
const optionToModel = new Map<string, Model<any>>();
|
|
216
|
-
const options = sorted.map((model) => {
|
|
217
|
-
const label = `${model.provider}/${model.id}`;
|
|
218
|
-
optionToModel.set(label, model);
|
|
219
|
-
return label;
|
|
220
|
-
});
|
|
221
|
-
options.push("(cancel)");
|
|
222
|
-
|
|
223
|
-
const choice = await ctx.ui.select(`Multiple models match "${query}" — choose one:`, options);
|
|
224
|
-
if (!choice || typeof choice !== "string" || choice === "(cancel)") return undefined;
|
|
225
|
-
return optionToModel.get(choice);
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
async function handleModel(trimmedArgs: string, ctx: ExtensionCommandContext, pi: ExtensionAPI | undefined): Promise<void> {
|
|
229
|
-
const availableModels = ctx.modelRegistry.getAvailable();
|
|
230
|
-
if (availableModels.length === 0) {
|
|
231
|
-
ctx.ui.notify("No available models found. Check provider auth and model discovery.", "warning");
|
|
232
|
-
return;
|
|
233
|
-
}
|
|
234
|
-
if (!pi) {
|
|
235
|
-
ctx.ui.notify("Model switching is unavailable in this context.", "warning");
|
|
236
|
-
return;
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
const trimmed = trimmedArgs.trim();
|
|
240
|
-
let targetModel: Model<any> | undefined;
|
|
241
|
-
|
|
242
|
-
if (!trimmed) {
|
|
243
|
-
if (!ctx.hasUI) {
|
|
244
|
-
const current = ctx.model ? `${ctx.model.provider}/${ctx.model.id}` : "(none)";
|
|
245
|
-
ctx.ui.notify(`Current model: ${current}\nUsage: /gsd model <provider/model|model-id>`, "info");
|
|
246
|
-
return;
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
const optionToModel = new Map<string, Model<any>>();
|
|
250
|
-
const options = sortModelsForSelection(availableModels, ctx.model).map((model) => {
|
|
251
|
-
const isCurrent = ctx.model && model.provider === ctx.model.provider && model.id === ctx.model.id;
|
|
252
|
-
const label = `${isCurrent ? "* " : ""}${model.provider}/${model.id}`;
|
|
253
|
-
optionToModel.set(label, model);
|
|
254
|
-
return label;
|
|
255
|
-
});
|
|
256
|
-
options.push("(cancel)");
|
|
257
|
-
|
|
258
|
-
const choice = await ctx.ui.select("Select session model:", options);
|
|
259
|
-
if (!choice || typeof choice !== "string" || choice === "(cancel)") return;
|
|
260
|
-
targetModel = optionToModel.get(choice);
|
|
261
|
-
} else {
|
|
262
|
-
targetModel = await resolveRequestedModel(trimmed, ctx);
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
if (!targetModel) {
|
|
266
|
-
ctx.ui.notify(`Model "${trimmed}" not found. Use /gsd model with an exact provider/model or a unique model ID.`, "warning");
|
|
267
|
-
return;
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
const ok = await pi.setModel(targetModel);
|
|
271
|
-
if (!ok) {
|
|
272
|
-
ctx.ui.notify(`No API key for ${targetModel.provider}/${targetModel.id}`, "warning");
|
|
273
|
-
return;
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
ctx.ui.notify(`Model: ${targetModel.provider}/${targetModel.id}`, "info");
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
export async function handleCoreCommand(
|
|
280
|
-
trimmed: string,
|
|
281
|
-
ctx: ExtensionCommandContext,
|
|
282
|
-
pi?: ExtensionAPI,
|
|
283
|
-
): Promise<boolean> {
|
|
182
|
+
export async function handleCoreCommand(trimmed: string, ctx: ExtensionCommandContext): Promise<boolean> {
|
|
284
183
|
if (trimmed === "help" || trimmed === "h" || trimmed === "?") {
|
|
285
184
|
showHelp(ctx);
|
|
286
185
|
return true;
|
|
@@ -304,10 +203,6 @@ export async function handleCoreCommand(
|
|
|
304
203
|
ctx.ui.notify(`Widget: ${getWidgetMode()}`, "info");
|
|
305
204
|
return true;
|
|
306
205
|
}
|
|
307
|
-
if (trimmed === "model" || trimmed.startsWith("model ")) {
|
|
308
|
-
await handleModel(trimmed.replace(/^model\s*/, "").trim(), ctx, pi);
|
|
309
|
-
return true;
|
|
310
|
-
}
|
|
311
206
|
if (trimmed === "mode" || trimmed.startsWith("mode ")) {
|
|
312
207
|
const modeArgs = trimmed.replace(/^mode\s*/, "").trim();
|
|
313
208
|
const scope = modeArgs === "project" ? "project" : "global";
|
|
@@ -165,10 +165,10 @@ export function buildCategorySummaries(prefs: Record<string, unknown>): Record<s
|
|
|
165
165
|
const modeSummary = mode ?? "(not set)";
|
|
166
166
|
|
|
167
167
|
// Models
|
|
168
|
-
const models = prefs.models as Record<string,
|
|
168
|
+
const models = prefs.models as Record<string, string> | undefined;
|
|
169
169
|
let modelsSummary = "(not configured)";
|
|
170
170
|
if (models && Object.keys(models).length > 0) {
|
|
171
|
-
const parts = Object.entries(models).map(([phase, model]) => `${phase}: ${
|
|
171
|
+
const parts = Object.entries(models).map(([phase, model]) => `${phase}: ${model}`);
|
|
172
172
|
modelsSummary = parts.join(", ");
|
|
173
173
|
}
|
|
174
174
|
|
|
@@ -255,38 +255,9 @@ export function buildCategorySummaries(prefs: Record<string, unknown>): Record<s
|
|
|
255
255
|
|
|
256
256
|
// ─── Category configuration functions ────────────────────────────────────────
|
|
257
257
|
|
|
258
|
-
export function formatConfiguredModel(config: unknown): string {
|
|
259
|
-
if (typeof config === "string") return config;
|
|
260
|
-
if (!config || typeof config !== "object") return "(invalid)";
|
|
261
|
-
const maybeConfig = config as { model?: unknown; provider?: unknown };
|
|
262
|
-
if (typeof maybeConfig.model !== "string" || maybeConfig.model.trim() === "") return "(invalid)";
|
|
263
|
-
if (typeof maybeConfig.provider === "string" && maybeConfig.provider && !maybeConfig.model.includes("/")) {
|
|
264
|
-
return `${maybeConfig.provider}/${maybeConfig.model}`;
|
|
265
|
-
}
|
|
266
|
-
return maybeConfig.model;
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
export function toPersistedModelId(provider: string, modelId: string): string {
|
|
270
|
-
if (!provider.trim()) return modelId;
|
|
271
|
-
const normalizedProvider = provider.trim();
|
|
272
|
-
const normalizedModelId = modelId.trim();
|
|
273
|
-
return normalizedModelId.startsWith(`${normalizedProvider}/`)
|
|
274
|
-
? normalizedModelId
|
|
275
|
-
: `${normalizedProvider}/${normalizedModelId}`;
|
|
276
|
-
}
|
|
277
|
-
|
|
278
258
|
async function configureModels(ctx: ExtensionCommandContext, prefs: Record<string, unknown>): Promise<void> {
|
|
279
|
-
const modelPhases = [
|
|
280
|
-
|
|
281
|
-
"planning",
|
|
282
|
-
"discuss",
|
|
283
|
-
"execution",
|
|
284
|
-
"execution_simple",
|
|
285
|
-
"completion",
|
|
286
|
-
"validation",
|
|
287
|
-
"subagent",
|
|
288
|
-
] as const;
|
|
289
|
-
const models: Record<string, unknown> = (prefs.models as Record<string, unknown>) ?? {};
|
|
259
|
+
const modelPhases = ["research", "planning", "execution", "completion"] as const;
|
|
260
|
+
const models: Record<string, string> = (prefs.models as Record<string, string>) ?? {};
|
|
290
261
|
|
|
291
262
|
const availableModels = ctx.modelRegistry.getAvailable();
|
|
292
263
|
if (availableModels.length > 0) {
|
|
@@ -321,7 +292,7 @@ async function configureModels(ctx: ExtensionCommandContext, prefs: Record<strin
|
|
|
321
292
|
providerOptions.push("(keep current)", "(clear)", "(type manually)");
|
|
322
293
|
|
|
323
294
|
for (const phase of modelPhases) {
|
|
324
|
-
const current =
|
|
295
|
+
const current = models[phase] ?? "";
|
|
325
296
|
const phaseLabel = `Model for ${phase} phase${current ? ` (current: ${current})` : ""}`;
|
|
326
297
|
|
|
327
298
|
// Step 1: pick provider
|
|
@@ -358,13 +329,13 @@ async function configureModels(ctx: ExtensionCommandContext, prefs: Record<strin
|
|
|
358
329
|
if (modelChoice === "(clear)") {
|
|
359
330
|
delete models[phase];
|
|
360
331
|
} else {
|
|
361
|
-
models[phase] =
|
|
332
|
+
models[phase] = modelChoice;
|
|
362
333
|
}
|
|
363
334
|
}
|
|
364
335
|
}
|
|
365
336
|
} else {
|
|
366
337
|
for (const phase of modelPhases) {
|
|
367
|
-
const current =
|
|
338
|
+
const current = models[phase] ?? "";
|
|
368
339
|
const input = await ctx.ui.input(
|
|
369
340
|
`Model for ${phase} phase${current ? ` (current: ${current})` : ""}:`,
|
|
370
341
|
current || "e.g. claude-sonnet-4-20250514",
|
|
@@ -381,8 +352,6 @@ async function configureModels(ctx: ExtensionCommandContext, prefs: Record<strin
|
|
|
381
352
|
}
|
|
382
353
|
if (Object.keys(models).length > 0) {
|
|
383
354
|
prefs.models = models;
|
|
384
|
-
} else {
|
|
385
|
-
delete prefs.models;
|
|
386
355
|
}
|
|
387
356
|
}
|
|
388
357
|
|
|
@@ -25,11 +25,11 @@ Then:
|
|
|
25
25
|
4. If the slice plan includes observability/diagnostic surfaces, confirm they work. Skip this for simple slices that don't have observability sections.
|
|
26
26
|
5. If the slice involved runtime behavior, fill the **Operational Readiness** section (Q8) in the slice summary: health signal, failure signal, recovery procedure, and monitoring gaps. Omit entirely for simple slices with no runtime concerns.
|
|
27
27
|
6. If this slice produced evidence that a requirement changed status (Active → Validated, Active → Deferred, etc.), call `gsd_requirement_update` with the requirement ID, updated `status`, and `validation` evidence. Do NOT write `.gsd/REQUIREMENTS.md` directly — the engine renders it from the database.
|
|
28
|
-
7.
|
|
29
|
-
8.
|
|
28
|
+
7. Write `{{sliceSummaryPath}}` (compress all task summaries).
|
|
29
|
+
8. Write `{{sliceUatPath}}` — a concrete UAT script with real test cases derived from the slice plan and task summaries. Include preconditions, numbered steps with expected outcomes, and edge cases. This must NOT be a placeholder or generic template — tailor every test case to what this slice actually built.
|
|
30
30
|
9. Review task summaries for `key_decisions`. Append any significant decisions to `.gsd/DECISIONS.md` if missing.
|
|
31
31
|
10. Review task summaries for patterns, gotchas, or non-obvious lessons learned. If any would save future agents from repeating investigation or hitting the same issues, append them to `.gsd/KNOWLEDGE.md`. Only add entries that are genuinely useful — don't pad with obvious observations.
|
|
32
|
-
11. Call `gsd_complete_slice` with
|
|
32
|
+
11. Call `gsd_complete_slice` with milestoneId, sliceId, the slice summary, and the UAT result. Do NOT manually mark the roadmap checkbox — the tool writes to the DB and renders the ROADMAP.md projection automatically.
|
|
33
33
|
12. Do not run git commands — the system commits your changes and handles any merge after this unit succeeds.
|
|
34
34
|
13. Update `.gsd/PROJECT.md` if it exists — refresh current state if needed: use the `write` tool with `path: ".gsd/PROJECT.md"` and `content` containing the full updated document reflecting current project state. Do NOT use the `edit` tool for this — PROJECT.md is a full-document refresh.
|
|
35
35
|
|
|
@@ -69,14 +69,14 @@ Then:
|
|
|
69
69
|
16. If you made an architectural, pattern, library, or observability decision during this task that downstream work should know about, append it to `.gsd/DECISIONS.md` (read the template at `~/.gsd/agent/extensions/gsd/templates/decisions.md` if the file doesn't exist yet). Not every task produces decisions — only append when a meaningful choice was made.
|
|
70
70
|
17. If you discover a non-obvious rule, recurring gotcha, or useful pattern during execution, append it to `.gsd/KNOWLEDGE.md`. Only add entries that would save future agents from repeating your investigation. Don't add obvious things.
|
|
71
71
|
18. Read the template at `~/.gsd/agent/extensions/gsd/templates/task-summary.md`
|
|
72
|
-
19.
|
|
73
|
-
20. Call `gsd_complete_task` with milestoneId, sliceId, taskId, and
|
|
72
|
+
19. Write `{{taskSummaryPath}}`
|
|
73
|
+
20. Call `gsd_complete_task` with milestoneId, sliceId, taskId, and a summary of what was accomplished. This is your final required step — do NOT manually edit PLAN.md checkboxes. The tool marks the task complete, updates the DB, and renders PLAN.md automatically.
|
|
74
74
|
21. Do not run git commands — the system reads your task summary after completion and creates a meaningful commit from it (type inferred from title, message from your one-liner, key files from frontmatter). Write a clear, specific one-liner in the summary — it becomes the commit message.
|
|
75
75
|
|
|
76
76
|
All work stays in your working directory: `{{workingDirectory}}`.
|
|
77
77
|
|
|
78
78
|
**Autonomous execution:** Do not call `ask_user_questions` or `secure_env_collect`. You are running in auto-mode — there is no human available to answer questions. Make reasonable assumptions and document them in the task summary. If a decision genuinely requires human input, note it in the summary and proceed with the best available option.
|
|
79
79
|
|
|
80
|
-
**You MUST call `gsd_complete_task`
|
|
80
|
+
**You MUST call `gsd_complete_task` AND write `{{taskSummaryPath}}` before finishing.**
|
|
81
81
|
|
|
82
82
|
When done, say: "Task {{taskId}} complete."
|
|
@@ -40,9 +40,9 @@ After all reviewers complete, aggregate their verdicts:
|
|
|
40
40
|
- If any reviewer says NEEDS-ATTENTION → overall verdict: `needs-attention`
|
|
41
41
|
- If any reviewer says FAIL → overall verdict: `needs-remediation`
|
|
42
42
|
|
|
43
|
-
### Step 3 —
|
|
43
|
+
### Step 3 — Write VALIDATION File
|
|
44
44
|
|
|
45
|
-
|
|
45
|
+
Write to `{{validationPath}}`:
|
|
46
46
|
|
|
47
47
|
```markdown
|
|
48
48
|
---
|
|
@@ -69,15 +69,13 @@ reviewers: 3
|
|
|
69
69
|
<if verdict is not pass: specific actions required>
|
|
70
70
|
```
|
|
71
71
|
|
|
72
|
-
Call `gsd_validate_milestone` with the camelCase fields `milestoneId`, `verdict`, `remediationRound`, `successCriteriaChecklist`, `sliceDeliveryAudit`, `crossSliceIntegration`, `requirementCoverage`, `verdictRationale`, and `remediationPlan` when needed. If you include verification-class analysis, pass it in `verificationClasses`.
|
|
73
|
-
|
|
74
72
|
**DB access safety:** Do NOT query `.gsd/gsd.db` directly via `sqlite3` or `node -e require('better-sqlite3')` — the engine owns the WAL connection. Use `gsd_milestone_status` to read milestone and slice state. All data you need is already inlined in the context above or accessible via the `gsd_*` tools. Direct DB access corrupts the WAL and bypasses tool-level validation.
|
|
75
73
|
|
|
76
74
|
If verdict is `needs-remediation`:
|
|
77
|
-
-
|
|
78
|
-
-
|
|
75
|
+
- Add new slices to `{{roadmapPath}}` with unchecked `[ ]` status
|
|
76
|
+
- These slices will be planned and executed before validation re-runs
|
|
79
77
|
|
|
80
|
-
**You MUST
|
|
78
|
+
**You MUST write `{{validationPath}}` before finishing.**
|
|
81
79
|
|
|
82
80
|
**File system safety:** When scanning milestone directories for evidence, use `ls` or `find` to list directory contents first — never pass a directory path (e.g. `tasks/`, `slices/`) directly to the `read` tool. The `read` tool only accepts file paths, not directories.
|
|
83
81
|
|
|
@@ -100,18 +100,6 @@ steps: []
|
|
|
100
100
|
// ─── Catalog Registration ────────────────────────────────────────────────
|
|
101
101
|
|
|
102
102
|
describe("workflow catalog registration", () => {
|
|
103
|
-
it("model appears in TOP_LEVEL_SUBCOMMANDS", () => {
|
|
104
|
-
const entry = TOP_LEVEL_SUBCOMMANDS.find((c) => c.cmd === "model");
|
|
105
|
-
assert.ok(entry, "model should be in TOP_LEVEL_SUBCOMMANDS");
|
|
106
|
-
assert.match(entry!.desc, /session model/i);
|
|
107
|
-
});
|
|
108
|
-
|
|
109
|
-
it("getGsdArgumentCompletions('m') includes model", () => {
|
|
110
|
-
const completions = getGsdArgumentCompletions("m");
|
|
111
|
-
const labels = completions.map((c: any) => c.label);
|
|
112
|
-
assert.ok(labels.includes("model"), "should include model completion");
|
|
113
|
-
});
|
|
114
|
-
|
|
115
103
|
it("workflow appears in TOP_LEVEL_SUBCOMMANDS", () => {
|
|
116
104
|
const entry = TOP_LEVEL_SUBCOMMANDS.find((c) => c.cmd === "workflow");
|
|
117
105
|
assert.ok(entry, "workflow should be in TOP_LEVEL_SUBCOMMANDS");
|
|
@@ -42,35 +42,3 @@ test("show-config only falls back when ctx.ui.custom() is unavailable", async ()
|
|
|
42
42
|
assert.equal(fallbackCtx.notices.length, 1, "unavailable overlay triggers text fallback");
|
|
43
43
|
assert.match(fallbackCtx.notices[0]!.message, /GSD Configuration/);
|
|
44
44
|
});
|
|
45
|
-
|
|
46
|
-
test("model command resolves and persists exact provider-qualified selection", async () => {
|
|
47
|
-
const selectedModel = { provider: "openai", id: "gpt-5.4" };
|
|
48
|
-
let applied: typeof selectedModel | null = null;
|
|
49
|
-
const ctx = {
|
|
50
|
-
hasUI: true,
|
|
51
|
-
model: { provider: "anthropic", id: "claude-sonnet-4-6" },
|
|
52
|
-
modelRegistry: {
|
|
53
|
-
getAvailable: () => [
|
|
54
|
-
{ provider: "anthropic", id: "claude-sonnet-4-6" },
|
|
55
|
-
selectedModel,
|
|
56
|
-
],
|
|
57
|
-
},
|
|
58
|
-
ui: {
|
|
59
|
-
notify: (message: string, type?: string) => {
|
|
60
|
-
notices.push({ message, type });
|
|
61
|
-
},
|
|
62
|
-
},
|
|
63
|
-
} as any;
|
|
64
|
-
const notices: Array<{ message: string; type?: string }> = [];
|
|
65
|
-
const pi = {
|
|
66
|
-
setModel: async (model: typeof selectedModel) => {
|
|
67
|
-
applied = model;
|
|
68
|
-
return true;
|
|
69
|
-
},
|
|
70
|
-
} as any;
|
|
71
|
-
|
|
72
|
-
const handled = await handleCoreCommand("model openai/gpt-5.4", ctx, pi);
|
|
73
|
-
assert.equal(handled, true);
|
|
74
|
-
assert.deepEqual(applied, selectedModel);
|
|
75
|
-
assert.match(notices[0]!.message, /openai\/gpt-5\.4/);
|
|
76
|
-
});
|
|
@@ -17,7 +17,6 @@ import {
|
|
|
17
17
|
parsePreferencesMarkdown,
|
|
18
18
|
_resetParseWarningFlag,
|
|
19
19
|
} from "../preferences.ts";
|
|
20
|
-
import { formatConfiguredModel, toPersistedModelId } from "../commands-prefs-wizard.ts";
|
|
21
20
|
import { _resetLogs, peekLogs } from "../workflow-logger.ts";
|
|
22
21
|
import type { GSDPreferences, GSDModelConfigV2, GSDPhaseModelConfig } from "../preferences.ts";
|
|
23
22
|
|
|
@@ -348,22 +347,6 @@ test("handles model config with explicit provider field", () => {
|
|
|
348
347
|
assert.equal(execution.provider, "bedrock");
|
|
349
348
|
});
|
|
350
349
|
|
|
351
|
-
test("formatConfiguredModel renders provider-qualified object config", () => {
|
|
352
|
-
assert.equal(
|
|
353
|
-
formatConfiguredModel({ model: "claude-opus-4-6", provider: "bedrock" }),
|
|
354
|
-
"bedrock/claude-opus-4-6",
|
|
355
|
-
);
|
|
356
|
-
});
|
|
357
|
-
|
|
358
|
-
test("toPersistedModelId prefixes provider chosen in prefs wizard", () => {
|
|
359
|
-
assert.equal(toPersistedModelId("openai", "gpt-5.4"), "openai/gpt-5.4");
|
|
360
|
-
assert.equal(
|
|
361
|
-
toPersistedModelId("openai", "openai/gpt-5.4"),
|
|
362
|
-
"openai/gpt-5.4",
|
|
363
|
-
"already-qualified IDs should be preserved",
|
|
364
|
-
);
|
|
365
|
-
});
|
|
366
|
-
|
|
367
350
|
test("handles empty models config", () => {
|
|
368
351
|
const prefs = parsePreferencesMarkdown("---\nversion: 1\n---\n");
|
|
369
352
|
assert.notEqual(prefs, null);
|
|
@@ -71,13 +71,11 @@ test("execute-task prompt references gsd_complete_task tool", () => {
|
|
|
71
71
|
assert.match(prompt, /gsd_complete_task/);
|
|
72
72
|
});
|
|
73
73
|
|
|
74
|
-
test("execute-task prompt
|
|
74
|
+
test("execute-task prompt instructs writing task summary before tool call", () => {
|
|
75
75
|
const prompt = readPrompt("execute-task");
|
|
76
|
+
// The prompt instructs writing the summary file AND calling the tool
|
|
76
77
|
assert.match(prompt, /\{\{taskSummaryPath\}\}/);
|
|
77
78
|
assert.match(prompt, /gsd_complete_task/);
|
|
78
|
-
assert.match(prompt, /DB-backed tool is the canonical write path/i);
|
|
79
|
-
assert.match(prompt, /Do \*\*not\*\* manually write `?\{\{taskSummaryPath\}\}`?/i);
|
|
80
|
-
assert.doesNotMatch(prompt, /^\d+\.\s+Write `?\{\{taskSummaryPath\}\}`?\s*$/m);
|
|
81
79
|
});
|
|
82
80
|
|
|
83
81
|
test("execute-task prompt does not instruct LLM to toggle checkboxes manually", () => {
|
|
@@ -121,14 +119,10 @@ test("guided-complete-slice prompt references gsd_slice_complete tool", () => {
|
|
|
121
119
|
|
|
122
120
|
test("complete-slice prompt instructs writing summary and UAT files before tool call", () => {
|
|
123
121
|
const prompt = readPrompt("complete-slice");
|
|
122
|
+
// The prompt instructs writing the summary AND UAT files, then calling the tool
|
|
124
123
|
assert.match(prompt, /\{\{sliceSummaryPath\}\}/);
|
|
125
124
|
assert.match(prompt, /\{\{sliceUatPath\}\}/);
|
|
126
125
|
assert.match(prompt, /gsd_complete_slice/);
|
|
127
|
-
assert.match(prompt, /DB-backed tool is the canonical write path/i);
|
|
128
|
-
assert.match(prompt, /Do \*\*not\*\* manually write `?\{\{sliceSummaryPath\}\}`?/i);
|
|
129
|
-
assert.match(prompt, /Do \*\*not\*\* manually write `?\{\{sliceUatPath\}\}`?/i);
|
|
130
|
-
assert.doesNotMatch(prompt, /^\d+\.\s+Write `?\{\{sliceSummaryPath\}\}`?.*$/m);
|
|
131
|
-
assert.doesNotMatch(prompt, /^\d+\.\s+Write `?\{\{sliceUatPath\}\}`?.*$/m);
|
|
132
126
|
});
|
|
133
127
|
|
|
134
128
|
test("complete-slice prompt preserves decisions and knowledge review steps", () => {
|
|
@@ -137,15 +131,6 @@ test("complete-slice prompt preserves decisions and knowledge review steps", ()
|
|
|
137
131
|
assert.match(prompt, /KNOWLEDGE\.md/);
|
|
138
132
|
});
|
|
139
133
|
|
|
140
|
-
test("validate-milestone prompt uses gsd_validate_milestone as canonical validation write path", () => {
|
|
141
|
-
const prompt = readPrompt("validate-milestone");
|
|
142
|
-
assert.match(prompt, /gsd_validate_milestone/);
|
|
143
|
-
assert.match(prompt, /\{\{validationPath\}\}/);
|
|
144
|
-
assert.match(prompt, /DB-backed tool is the canonical write path/i);
|
|
145
|
-
assert.match(prompt, /Do \*\*not\*\* manually write `?\{\{validationPath\}\}`?/i);
|
|
146
|
-
assert.doesNotMatch(prompt, /Write to `?\{\{validationPath\}\}`?:/i);
|
|
147
|
-
});
|
|
148
|
-
|
|
149
134
|
test("complete-slice prompt still contains template variables for context", () => {
|
|
150
135
|
const prompt = readPrompt("complete-slice");
|
|
151
136
|
assert.match(prompt, /\{\{sliceSummaryPath\}\}/);
|
|
File without changes
|
|
File without changes
|