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.
Files changed (58) hide show
  1. package/dist/resources/extensions/gsd/commands/catalog.js +1 -2
  2. package/dist/resources/extensions/gsd/commands/dispatcher.js +1 -1
  3. package/dist/resources/extensions/gsd/commands/handlers/core.js +1 -91
  4. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +5 -39
  5. package/dist/resources/extensions/gsd/prompts/complete-slice.md +3 -3
  6. package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -3
  7. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +5 -7
  8. package/dist/web/standalone/.next/BUILD_ID +1 -1
  9. package/dist/web/standalone/.next/app-path-routes-manifest.json +18 -18
  10. package/dist/web/standalone/.next/build-manifest.json +3 -3
  11. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  12. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  13. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  14. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  15. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  16. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  17. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  18. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  19. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  20. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  21. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  22. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  23. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  24. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  25. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  26. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  27. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  28. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  29. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  30. package/dist/web/standalone/.next/server/app/index.html +1 -1
  31. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  32. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  33. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  34. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  35. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  36. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  37. package/dist/web/standalone/.next/server/app-paths-manifest.json +18 -18
  38. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  39. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  40. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  41. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  42. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  43. package/dist/web/standalone/.next/static/chunks/{6502.b804e48b7919f55e.js → 6502.8874bcae249c02e1.js} +3 -3
  44. package/dist/web/standalone/.next/static/chunks/{webpack-65f0501b197d1c49.js → webpack-9fed74684e1c5bb1.js} +1 -1
  45. package/package.json +1 -1
  46. package/src/resources/extensions/gsd/commands/catalog.ts +1 -2
  47. package/src/resources/extensions/gsd/commands/dispatcher.ts +2 -1
  48. package/src/resources/extensions/gsd/commands/handlers/core.ts +2 -107
  49. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +7 -38
  50. package/src/resources/extensions/gsd/prompts/complete-slice.md +3 -3
  51. package/src/resources/extensions/gsd/prompts/execute-task.md +3 -3
  52. package/src/resources/extensions/gsd/prompts/validate-milestone.md +5 -7
  53. package/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts +0 -12
  54. package/src/resources/extensions/gsd/tests/core-overlay-fallback.test.ts +0 -32
  55. package/src/resources/extensions/gsd/tests/preferences.test.ts +0 -17
  56. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +3 -18
  57. /package/dist/web/standalone/.next/static/{CrKrzIIxk55witDF1eS0L → FRT6f5ou3wPxpZ7ojoB7E}/_buildManifest.js +0 -0
  58. /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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gsd-pi",
3
- "version": "2.67.0-dev.43b0159",
3
+ "version": "2.67.0-dev.46f9884",
4
4
  "description": "GSD — Get Shit Done coding agent",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -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|model|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";
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, pi),
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 { ExtensionAPI, ExtensionCommandContext, ExtensionContext } from "@gsd/pi-coding-agent";
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 sortModelsForSelection(models: Model<any>[], currentModel: Model<any> | undefined): Model<any>[] {
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, unknown> | undefined;
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}: ${formatConfiguredModel(model)}`);
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
- "research",
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 = formatConfiguredModel(models[phase]);
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] = toPersistedModelId(providerName, modelChoice);
332
+ models[phase] = modelChoice;
362
333
  }
363
334
  }
364
335
  }
365
336
  } else {
366
337
  for (const phase of modelPhases) {
367
- const current = formatConfiguredModel(models[phase]);
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. Prepare the slice completion content you will pass to `gsd_complete_slice` using the camelCase fields `milestoneId`, `sliceId`, `sliceTitle`, `oneLiner`, `narrative`, `verification`, and `uatContent`. Do **not** manually write `{{sliceSummaryPath}}`. Do **not** manually write `{{sliceUatPath}}` the DB-backed tool is the canonical write path for both artifacts.
29
- 8. Draft the UAT content you will pass as `uatContent` — 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.
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 the camelCase fields `milestoneId`, `sliceId`, `sliceTitle`, `oneLiner`, `narrative`, `verification`, and `uatContent`, plus any optional enrichment fields you have. Do NOT manually mark the roadmap checkbox — the tool writes to the DB, renders `{{sliceSummaryPath}}` and `{{sliceUatPath}}`, and updates the ROADMAP.md projection automatically.
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. Use that template to prepare the completion content you will pass to `gsd_complete_task` using the camelCase fields `milestoneId`, `sliceId`, `taskId`, `oneLiner`, `narrative`, `verification`, and `verificationEvidence`. Do **not** manually write `{{taskSummaryPath}}` — the DB-backed tool is the canonical write path and renders the summary file for you.
73
- 20. Call `gsd_complete_task` with milestoneId, sliceId, taskId, and the completion fields derived from the template. This is your final required step — do NOT manually edit PLAN.md checkboxes. The tool marks the task complete, updates the DB, renders `{{taskSummaryPath}}`, and updates PLAN.md automatically.
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` before finishing. Do not manually write `{{taskSummaryPath}}`.**
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 — Persist Validation
43
+ ### Step 3 — Write VALIDATION File
44
44
 
45
- Prepare the validation content you will pass to `gsd_validate_milestone`. Do **not** manually write `{{validationPath}}` — the DB-backed tool is the canonical write path and renders the validation file for you.
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
- - Use `gsd_reassess_roadmap` to add the remediation slices instead of editing `{{roadmapPath}}` manually
78
- - Those slices will be planned and executed before validation re-runs
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 call `gsd_validate_milestone` before finishing. Do not manually write `{{validationPath}}`.**
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 uses gsd_complete_task as canonical summary write path", () => {
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\}\}/);