Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add spec for #1620 #2650

Open
wants to merge 7 commits into
base: master
Choose a base branch
from
Open

Conversation

SirusCodes
Copy link

@SirusCodes SirusCodes commented Oct 29, 2022


Create a spec as requested by @denelon at #1620 (comment)

Microsoft Reviewers: Open in CodeFlow

@SirusCodes
Copy link
Author

@microsoft-github-policy-service agree

@SirusCodes SirusCodes marked this pull request as ready for review October 31, 2022 19:19
@SirusCodes SirusCodes requested a review from a team as a code owner October 31, 2022 19:19
@SirusCodes
Copy link
Author

@denelon can you review it?

@denelon
Copy link
Contributor

denelon commented Oct 31, 2022

My "meta" feedback is this seems to work well for installing a single package.

We shouldn't have ambiguity with import since the source and the ID need to be specified in the packages.json file.

I wonder if we should have a "default" behavior and settings to change the default behavior. It may not be necessary, but this is a departure from the current behavior.

I'm also not sure what this is going to "sound" like with narrator running.

Our telemetry needs to be reasoned about as well. If a user runs winget install <something> and we're not able to narrow it down to a single package, I don't want to have some "false" increased concept of "success".

@denelon
Copy link
Contributor

denelon commented Oct 31, 2022

@yao-msft what are your thoughts here?

@yao-msft
Copy link
Contributor

yao-msft commented Oct 31, 2022

This package selection mechanism could be extended to winget upgrade <single package>, winget uninstall <single package> and winget show <single package> as well, since these use the same worflow to pick a package internally.

Regarding default behavior, I think it'd be better to make this one opt-in from a specific argument (or settings?) since most automated systems, script writers will not be compatible with this change. Or we should announce this "breaking" default behavior well ahead before we make this the default behavior. In the early winget design principal, winget tries not to prompt for user input unless it has to(i.e. accepting agreements, missing arguments, etc), and the prompt can be disabled in many ways.

Regarding installing multiple packages in one command, it requires further thinking and framework changes are likely required to support this. Command line syntax may also need to be revisited.

@denelon
Copy link
Contributor

denelon commented Oct 31, 2022

@yao-msft
So maybe something like adding "--prompt" could prompt if the results are ambiguous, and a setting could be added to make the setting default and "--no-prompt" could override the setting via the CLI?

@yao-msft
Copy link
Contributor

@yao-msft So maybe something like adding "--prompt" could prompt if the results are ambiguous, and a setting could be added to make the setting default and "--no-prompt" could override the setting via the CLI?

We already have a cli arg and user setting both called "DisableInteractivity" to indicate "no prompt", it's opted in for com callers(can not be overriden) but not from cli. So I guess the current default in cli is already "allow prompt". But currently only very few packages will trigger a prompt. With this feature, we'll see prompts a lot more, so I'm wondering if we should have a specific opt in for this(from settings), we may change the default behavior in future. In another thought, if existing scripts work, they should already be able to point to a specific package, so it might not be that "breaking" for existing scripts and automated systems. I think a setting for opt in is enough. And I'm open to other suggestions as well.

@SirusCodes
Copy link
Author

This package selection mechanism could be extended to winget upgrade <single package>, winget uninstall <single package> and winget show <single package> as well, since these use the same worflow to pick a package internally.

Yes this can/should be extended to those as well. Will make that change in the spec.

Regarding default behavior, I think it'd be better to make this one opt-in from a specific argument (or settings?) since most automated systems, script writers will not be compatible with this change. Or we should announce this "breaking" default behavior well ahead before we make this the default behavior. In the early winget design principal, winget tries not to prompt for user input unless it has to(i.e. accepting agreements, missing arguments, etc), and the prompt can be disabled in many ways.

Can you please elaborate on this more? As I feel it will only come in if there are multiple matches and we get a table of packages in current implementation.
Everyone would write a script using Id's which are a unique to each package and if they get the selector they will get the current table in current implementation.
Only difference would be that in current implementation the command would return and not wait for an user input.

Regarding installing multiple packages in one command, it requires further thinking and framework changes are likely required to support this. Command line syntax may also need to be revisited.

Yeah, that is not the goal of this spec. I added that because if in future we plan to add that this is how selector should work.

@SirusCodes
Copy link
Author

With this feature, we'll see prompts a lot more

How? This will only come into picture if there are multiple matches in current implementation.

For example.

winget install Powershell

It currently gives you 2 packages and after this it will also give you 2 packages just will a easy selector.

@SirusCodes
Copy link
Author

I'm also not sure what this is going to "sound" like with narrator running.

Yeah I'm also not sure about that but if it reads it line by line then there shouldn't be a big problem.
Maybe I can try implementing a dummy one and see.

Our telemetry needs to be reasoned about as well. If a user runs winget install <something> and we're not able to narrow it down to a single package, I don't want to have some "false" increased concept of "success".

I haven't thought about this. Can you help me out with it?

@ghost ghost added the Needs-Author-Feedback Issue needs attention from issue or PR author label Nov 1, 2022
@Trenly
Copy link
Contributor

Trenly commented Nov 1, 2022

I wonder if we should have a "default" behavior and settings to change the default behavior. It may not be necessary, but this is a departure from the current behavior.

I think this is a necessity, especially for this feature. As was mentioned in the original issue and I touched upon in my review, there are users who will not want this feature at all - even outside of a scripting perspective. I would be a strong advocate for including user settings.

Our telemetry needs to be reasoned about as well. If a user runs winget install and we're not able to narrow it down to a single package, I don't want to have some "false" increased concept of "success".

I think this is as "simple" as adding a context flag that gets set whenever the interactive selector gets called, and sending that flag along with the telemetry. I would still count it as a success if the user was able to manually disambiguate, but I can understand if the internal needs differ here.

This package selection mechanism could be extended to winget upgrade , winget uninstall and winget show as well, since these use the same workflow to pick a package internally.

I think implementing this for upgrade would conflict with #2627. It may be a good feature in the meantime though. I agree with adding it for uninstall and show.

With this feature, we'll see prompts a lot more, so I'm wondering if we should have a specific opt in for this(from settings), we may change the default behavior in future. In another thought, if existing scripts work, they should already be able to point to a specific package, so it might not be that "breaking" for existing scripts and automated systems. I think a setting for opt in is enough. And I'm open to other suggestions as well.

I go both ways on this. On one hand you have people like me who are technically inclined that would prefer to see and work with CLI output directly rather than have any form of interactivity in a CLI application, except that which is strictly necessary. On the other hand you have people who are using winget to install their favorite application and want it to be as quick and seamless as possible, and having interactivity would help. I think opt-out is easiest to implement from the DisableInteractivity perspective, and keeps the same current default behavior as other interactivity, but I prefer the original design principal of not asking for input unless we have to. I say that opt-in would be my final preference. (Apologies for long section, had to write my thoughts down for me to understand them myself)

Regarding default behavior, I think it'd be better to make this one opt-in from a specific argument (or settings?) since most automated systems, script writers will not be compatible with this change

I agree. Not only because of the points mentioned above, but I know that some scripts like marinet101/WingetUI actually use the table output and parse the text. Adding in an additional column here or making it so that the feature is opt-out would be a breaking change for them.

Everyone would write a script using Id's which are a unique to each package and if they get the selector they will get the current table in current implementation.

Id's aren't always guaranteed to be unique to a package. The item which is guaranteed to be unique is the Source-ID pair. It is entirely possible that two sources have the same identifier for different packages.

In another thought, if existing scripts work, they should already be able to point to a specific package, so it might not be that "breaking" for existing scripts and automated systems.

The more I think about this, I believe that the dynamic nature of sources would make this a breaking change. It is entirely possible that a script which is working today could be broken tomorrow by someone adding a new package to the repository, assuming the script was pointing at a volatile field like a package name; Or even in cases where a sub-package is added and there is potential for a moniker conflict that we aren't aware of. I would suspect that a sysadmin would rather have 1 package that failed to install with a very clear log about why as opposed to coming back several hours later just to find that the script hung because they weren't aware of the --disable-interactivity flag, and thought there would be no issues since the script was working fine before.

@ghost ghost removed the Needs-Author-Feedback Issue needs attention from issue or PR author label Nov 2, 2022
Co-authored-by: Kaleb Luedtke <trenlymc@gmail.com>
@denelon
Copy link
Contributor

denelon commented Nov 3, 2022

I think the default behavior should not change. This would certainly be breaking. I would expect to have a setting for "disambiguation". maybe "prompt" and "no-prompt". Then if one had the default they could override with "--prompt" or "--no-prompt".

The default setting would be "no-prompt"

Overriding the default setting would look like:

winget install PowerToys --prompt

Changing the default setting would look like:

"packageDisambiguation": {"prompt"}

Overriding the "prompt" setting would look like:

winget install PowerToys --no-prompt

@denelon
Copy link
Contributor

denelon commented Nov 3, 2022

Changing this behavior to be the default would require:

@SirusCodes
Copy link
Author

Hey @denelon, @yao-msft and @Trenly for your suggestions. I have updated the specs from suggestions you have given.

Tho there are a few things where I don't have much knowledge about and would be great if you can help me out in those parts.

I think implementing this for upgrade would conflict with #2627. It may be a good feature in the meantime though. I agree with adding it for uninstall and show.

@Trenly I'm not sure how this will conflict it


I think this is as "simple" as adding a context flag that gets set whenever the interactive selector gets called, and sending that flag along with the telemetry. I would still count it as a success if the user was able to manually disambiguate, but I can understand if the internal needs differ here.

I don't have any knowledge how telemetry and localization work and hence couldn't add anything about it in spec.

It would be great if you can point be where I can get to know about those.


I tried by printing an example on terminal with screen reader on. It read me the whole thing correctly but read No. (abbreviation of number) as No (as in answer to question).

Is there a way where we can get to know that the screen reader is on and print Number instead of No. or we should stick with Number?


I need your suggestions on how refine search should work. Should it refine results on the basis of exact match or match pattern?

I'm inclined towards matching patterns, but it may result into extra steps for users. Like if there are 2 packages with name Example and a package with name Example2 pattern matching will result in to retaining all three if user types Example to refine them. But at the same time, it will help users to type less to refine results.

Again, I would like it to be as pattern matching thing instead of exact match.


As previously discussed in review comment to have tab selection.

I'm not sure if it will be intuitive for users to use Tab to cycle through number. But if we are going with this, I want your opinion on if it should only cycle through number or package names as well? It doesn't make much sense to me to have both, cycling through numbers is more than enough in my opinion.

Also, if we are having Tab to cycle forward then we should have Tab + Shift to cycle backwards.

@Trenly
Copy link
Contributor

Trenly commented Nov 12, 2022

@Trenly I'm not sure how this will conflict it

If a user were to type winget upgrade Microsoft - there are multiple packages that match. The conflict would be whether the selection menu is shown, or if all packages matching Microsoft would be upgraded

Is there a way where we can get to know that the screen reader is on

I'm certain this is possible, it would just be a matter of how big the change would be to support this. It's probably better to use the full text Number all the time, or an alternate name like Index

I need your suggestions on how refine search should work. Should it refine results on the basis of exact match or match pattern?

I would suggest this be implemented as a temporary source. Essentially, the results in the table (including those that are truncated), would become a local source, and the default query behavior would be used. I believe this is a substring match, but I'd leave it up to whatever the current default search behavior is

I want your opinion on if it should only cycle through number or package names as well

My interpretation of denelon's comments is that tab completion would be most beneficial for cycling through Package Identifiers, and wouldn't be as helpful / necessary for numbers.

Also, if we are having Tab to cycle forward then we should have Tab + Shift to cycle backwards.

I agree. This is the current implementation of the tab completion used in the client, and the behavior should be carried forward.

@SirusCodes
Copy link
Author

If a user were to type winget upgrade Microsoft - there are multiple packages that match. The conflict would be whether the selection menu is shown, or if all packages matching Microsoft would be upgraded

So that should be added in potential issues section, right?

I'm certain this is possible, it would just be a matter of how big the change would be to support this. It's probably better to use the full text Number all the time, or an alternate name like Index

Number feels a better user-friendly word.

I would suggest this be implemented as a temporary source. Essentially, the results in the table (including those that are truncated), would become a local source, and the default query behavior would be used. I believe this is a substring match, but I'd leave it up to whatever the current default search behavior is

I feel default one is pattern matching by looking at the winget upgrade Microsoft example.

My interpretation of denelon's comments is that tab completion would be most beneficial for cycling through Package Identifiers, and wouldn't be as helpful / necessary for numbers.


Perfect, will make the necessary changes in next iteration.

use `-n` flag for result number
use `-m` flag for more results
tab completion
conflict in `upgrade` command
minor fixes
@SirusCodes SirusCodes requested review from Trenly and denelon and removed request for Trenly November 16, 2022 07:02
@SirusCodes SirusCodes removed the request for review from denelon November 28, 2022 17:17
@SirusCodes
Copy link
Author

@Trenly should we also rename of file to Query refinement.md?

@Trenly
Copy link
Contributor

Trenly commented Nov 29, 2022

@Trenly should we also rename of file to Query refinement.md?

Probably a good idea

@github-actions
Copy link

github-actions bot commented Dec 9, 2022

@check-spelling-bot Report

🔴 Please review

See the 📂 files view or the 📜action log for details.

Unrecognized words (1679)
aconf
acroformtool
actime
adb
adcl
addb
ADDBNDDIRE
ADDFILEINEXISTINGZIP
ADDINZIP
addl
addler
addpoint
addq
addsuffix
addthis
adelaide
adler
adr
adrret
AFile
Ahvenlampi
AIAIAIAIAIAIA
alain
ALDAN
Alexey
allshared
allstatic
aloop
amigaos
amk
andb
andl
andq
Andrzej
andthis
anisimkov
Aonix
aopt
appnote
arcname
AREGTYPE
ARFLAGS
armv
arrayasolutions
ARRR
ASFLAGS
Asmflags
ASMINF
ASMS
ASMV
assmebler
Asumes
atari
atarist
Athlon
Attension
attrb
AUTOMAKE
autoselect
axp
BADZIPFILE
bak
Bakker
balign
bcc
bclose
bcopy
beahvior
beenhere
Beihang
BEOS
BERGEN
bestlen
bestlend
Betts
Beucler
BFINAL
bflush
bgcolor
bget
bhelp
BIGBUFSIZE
BINFILES
bitbuf
bitcnt
bitlen
bitslong
bjoern
BKUPIFSNAME
Blammo
blbits
blcodes
blen
blindex
BLKTYPE
bload
BLOCKSIZE
bname
BNDDIR
bndsrc
bobdl
bonnefoy
bopen
bopt
Borca
borgsys
borland
BORLANDC
Borstel
Bosmans
Botlan
broonie
Broukhis
bsd
bsfw
bsize
bskip
Bson
bstate
bstream
BTYPE
buflen
BUFREADCOMMENT
BUFSIZ
bugtraq
bugzilla
builddir
BUILDFIXED
Burik
BYFOUR
bytary
BYTEBITS
bytecodes
Bytef
bythirds
bzalloc
bzfree
bziped
bzlib
cachefly
caddr
Cadieux
caltech
carrefull
Caruana
CASESENSITIVITY
CASESENSITIVITYDEFAULT
CASESENSITIVITYDEFAULTVALUE
casestudies
castleproject
catchorg
ccflags
CCheck
ccopt
ccrc
CCSID
cdef
cdh
cdir
centraldir
centralheader
CENTRALHEADERMAGIC
cfa
CFBF
CFILES
cflags
cfz
chainlen
chainlenwmask
charf
Charlap
checkfn
Chemeris
chksum
chng
chofz
choosen
CHOST
CHR
christop
CHRTYPE
Chupahin
CINFO
Clarius
clen
cloexec
Clure
cmakedefine
CMakefile
cmakein
CMBND
cmovng
cmovngl
cmovnl
cmpb
cmpl
cmpq
cmpress
Cmps
cmpw
cmr
codecount
CODEOWNERS
codetype
Coghlan
coments
Compaq
comparision
compearing
complen
completly
compr
compres
comprlen
Comression
comsize
concantenated
confh
consts
CONTTYPE
copymeta
copyout
Cosmin
cosmint
couse
cov
Coverity
cpan
cparm
cpluplus
cplusplus
CPPFILES
CPPFLAGS
cpr
cpsize
cranies
CRCERROR
CRCs
CREATEAFTER
Creech
CRTBNDDIR
CRTCMOD
CRTDLL
CRTDUPOBJ
CRTL
CRTLIB
CRTSRCPF
CRTSRVPGM
crypthead
crypting
csh
csource
Ctrm
CURDIR
curfile
curlen
curmatch
curmatchd
currentfile
currenty
curretly
cvs
CXe
CXXFLAGS
Cybozu
cygwin
cygz
Cyrix
Dalsnes
Darbois
DATAA
datablock
datasize
DATASPHERE
davispuh
dbakker
dbase
DBGVIEW
dbits
DCheck
dcode
ddr
dealloc
DEBND
decc
decomp
decompresed
decompressd
decompressor
DEEND
defaut
defcpr
Defl
deflatestate
DEIN
Dellaca
delphi
delte
depedent
depl
DEPSDIR
derivated
derrived
descrip
DESTDIR
destlen
devkitarm
devkitpro
devmajor
devminor
dext
dfa
dictid
Diekhans
diffs
DINFOZIP
DIRTYPE
distbits
distclean
distcnt
distcode
DISTEXT
DISTFILES
distfix
distlen
distribtution
dists
distsym
DJDIR
djgpp
dlname
DLocator
dlversion
dmask
dmax
Dmitriy
DNO
dnrsl
dnsrl
DOBIG
dodist
dolen
DOLIT
Donais
donwload
dosdate
dostime
dotzlib
Dpos
DRecord
DROPBITS
Dropbox
DSIZE
DTAFMT
dtree
DUMPDIR
DUPLICATEALIAS
DYLD
dylib
dynamiclib
dynazip
DYNBNDDIR
easilty
eax
ebp
ebx
ECCN
ECompression
ecx
edd
Eddelbuettel
EDecompression
edi
EDTF
edu
eduardo
edx
eeee
eeeee
Eerror
eetbeetee
efah
eflags
eief
Elahi
Elemar
elems
ello
empted
emx
emximp
emxomfar
Enchance
endef
ENDHEADERMAGIC
ENDLOCHEADERMAGIC
endp
ENDPGMEXP
endproc
endsource
endsubroutine
Ener
eob
EOC
eocd
eocdl
eocdr
eod
eol
eprefix
eqs
equ
ERCIM
Eron
errclose
errnum
ERRORREXX
esac
esi
eso
essex
etags
eurexchange
Evain
exabytes
examplesh
Exarevsky
execve
exitval
EXLEN
exmples
explicitely
EXPOR
EXPORTVA
EXPREFIX
extened
extproc
extr
extractdir
extrafield
extrainfo
extsize
exvlo
EZlib
fabricbot
facil
falloc
Fanslau
Fantoftvegen
fao
FAQs
farcall
farfree
farmalloc
Farshid
fastcall
FBuffer
fcalloc
FCHECK
fcntl
FCOMMENT
FDICT
fdopen
Fearnley
Fedtke
feloop
FEXTRA
fff
fffffef
fffffffffffffef
ffffffffh
FFFFh
fffh
ffunc
FHCRC
Fiala
fifield
FIFOTYPE
filebuffer
filedate
Fileflags
filefunc
fileinfo
filemane
filenameinzip
filestream
filetime
fillbuf
fillzffunc
filnam
fiow
fitblk
fixedtables
FIXLCODES
fjoin
FLa
Flate
FLEVEL
FLG
Flgvmat
Flinffas
Flinffasx
Flmatch
flushbuf
FLUSHCODE
fmemcmp
fmemcpy
fmemset
fnc
fnsize
follwed
formely
FORPARSING
fout
Frodo
FROMLIB
Frysinger
fseeki
fseeko
FStrm
ftelli
ftello
ftestexist
FTEXT
ftime
ftm
FUJITSU
fxxxx
Gailly
gcc
gcclib
gcda
gcno
GCopyright
gcov
gdal
Genererate
getheader
getjpi
getoct
getsyi
Gflags
Giersig
ginstall
globalcomment
globbing
globl
gname
gnatmake
gnatwcfilopru
gnatyabcefhiklmnoprst
gnuc
GNUCC
gnupg
GNUTYPE
Gomes
google
gosub
gpflag
gpr
Greef
Groffen
gsi
Guevarra
Gulles
gunpipe
gvmat
gvmatch
gxs
gzappend
gzbody
gzbuffer
GZBUFSIZE
gzclearerr
gzclose
GZCOMPRESS
gzcopy
gzdirect
gzdopen
gzeek
gzeof
gzerror
gzext
gzfilebuf
gzfilestream
gzflags
gzflush
gzfread
gzfwrite
gzgetc
gzgets
gzguts
gzhead
gzheader
gzifstream
gzindex
gzinit
gzio
gziped
gzipped
gzjoin
gzlib
gzlog
gzoffset
gzofstream
gzomanip
gzopen
gzprint
gzprintf
gzputc
gzputs
gzread
gzrewind
gzs
gzscan
gzseek
gzsetparams
gztack
gztell
gzungetc
gzvprintf
gzwrite
Haan
Hainley
Haksi
halloc
Haruhiko
havedict
hbuf
HCLEN
hcrc
HDIST
hdone
hdr
headerp
headr
henrik
Herborth
hfree
highwater
Hildenborg
Hirschberg
hlibz
HLIT
hloop
hoehrmann
Holmgren
Homurlu
Horvath
HOS
hotmail
HOWTO
HPFS
HPUX
huffman
huft
icbt
icc
iconr
idel
idl
ietf
IFCRYPTALLOWED
ifd
ifeq
ifneq
IFSDIR
IFSFILE
IIf
ijs
implib
improvment
inbuf
INCDIR
INCDIRFIRST
INCLUDECRYPTINGCODE
includedir
incnt
incompartible
INCOPY
incq
INDATABLOCK
indp
INEND
INFA
infback
infblock
infcodes
infcover
inffas
inffast
inffasx
inffix
infoserve
infozip
inftest
inftree
infun
infutil
Ingy
inhow
ININ
INITBITS
inlen
inmemory
inname
INSEDI
insertor
instream
INSY
INTABL
interix
INTERNALERROR
interntal
interupted
intf
invalidparameter
inzip
ioapi
iowin
irix
irrez
isable
isdst
ISSPECIAL
itu
izstream
JELMER
Jguer
jhainley
jloup
jnc
jne
jon
joran
Kazuho
kbytes
Kconform
Keio
kevin
keyshift
KFree
Kientzle
Kirill
KJk
Kleinert
Klomp
Kohlhoff
KPIC
kreuzerkrieg
Krinke
Krzemienski
ksh
Kuchling
Kuno
Kupries
LARGEFILE
lastbit
lastblock
lasterr
lastest
lastoff
lastslash
lbase
lbits
lcc
lcode
lcompr
LDADD
ldconfig
ldef
LDFLAGS
ldi
ldinext
LDLIBS
LDSHARED
LDSHAREDLIBC
leaq
Lelewer
Lempel
lenb
lenbits
lencnt
lencode
LENEXT
lenfix
lenlen
lensym
Lepilleur
lext
lfh
LGCHUNK
libc
LIBCMT
libdefs
libdest
libdir
libgz
LIBIFSNAME
LIBL
libminizip
LIBNAME
LIBNDS
libopt
libpng
LIBRARYN
libz
libzdll
libzip
libzshr
Lillge
limitd
Linhart
linkedlist
Linkflags
linkname
linkonly
linkto
LINX
LIres
listfiles
litcnt
litcode
litlen
litsym
lld
Llopis
llu
lmask
lng
lngfnc
lngpvt
lnk
LNKTYPE
LOADONCALL
LOCALETYPE
LOCALHEADER
LOCALHEADERMAGIC
localstatedir
locft
loctm
lodsl
logd
LOGID
Lohmann
Loitsch
Londer
Longf
LONGLINK
longlong
LONGNAME
Looijaard
lopts
Lovset
LPCTSTR
LPCWSTR
lpdw
LPWORD
lseek
lseeki
LTLIBRARIES
ltree
lunpipe
Lvl
lzw
MACTYPES
madler
mak
MAKECRCH
makedepend
makedir
makefiles
makefixed
Makeit
makelcc
maketree
MAKEULONG
malbrech
mandoc
mapfile
markn
marknelson
Marot
masm
masmdl
masmx
matchname
mathias
mathod
MATSUURA
MAXBITS
MAXCODES
MAXD
MAXDCODES
maxed
MAXFILENAME
MAXFILENAMEINZIP
MAXLCODES
MAXSEG
MAXU
MAXWIN
mbc
MBR
mcr
mdef
mdsos
Metrowerks
metux
Micael
minigzip
minigzipsh
miniunz
miniunzip
minizip
minzip
Mitsunari
mkasm
mktemp
MKWERKS
mman
mmap
mmap'ed
mmap'ing
MMD
mmk
mms
mmx
MNG
modft
modific
MODIFSNAME
modtime
module'mod
modulos
Moene
Mohanathas
Mokrejs
Monnerat
Moretti
mostlyclean
movb
movl
movzbl
movzwl
mozilla
MPROP
mrdone
mrloop
mrsloop
msc
MSCVER
msdos
msgbuf
msvc
MSVCR
MSVCRT
msym
mtest
mthumb
mtune
Mula
MULTIVOL
munmap
muppetlabs
MWERKS
MWKERKS
myalloc
mydef
mydir
myfree
mymkdir
myndkryme
myproc
myrec
mytest
mztools
nastygram
nbytes
ncode
ndist
nds
Necasek
NEEDBITS
negl
nes
nevetheless
newdate
newdir
NEWOBJ
Newsham
Nex
nextlen
Ngth
nicematch
Nieder
Niessink
nih
nihilo
Nikl
Nintendo
nintendods
nitems
nlen
nlm
nlohmann
nmake
NMAX
nnn
NOBYFOUR
noconf
NOCRYPT
noe
nofac
noi
NOICONS
noident
nolog
nologo
Nomssi
NONSTDC
noopt
noprefix
Norwitz
nosever
NOSINT
nospan
NOSTACKCHECK
NOSTKCHK
NOSUCHFILE
notdir
notext
notlifo
notw
NOUNCRYPT
NOUNDERLINE
novell
NOVER
NOVERSION
nprintf
nroff
Nyffenegger
Nzali
Oait
Oberhumer
OBJA
OBJC
OBJG
OBJP
OBJPA
OBJTYPE
OBJZ
obry
oflag
oilrtfm
Okt
Oku
Okumura
olb
oldnewthing
olist
oml
ommit
onefile
OOXML
opportunites
OPTALIAS
OPTCOMP
OPTDEP
Opteron
optf
optfile
OPTGO
Optimisation
OPTINL
OPTINLINE
OPTINLOCAL
OPTLOOP
OPTPEEP
OPTRDEP
OPTSCHED
OPTTIME
origlen
oring
orq
Osma
oss
OSX
ouput
ourselfs
outbuf
outcnt
outd
Outercurve
outf
outfun
outhow
outlen
outnname
outputresource
ozstream
paag
paches
packcode
palmzlib
parafernalia
PARAMERROR
PARMS
partcompress
particuarly
pbegin
PByte
PChar
Pcn
pcount
pcrc
pdflib
Pehrson
pentium
perlfaq
pez
pfile
pfilefunc
pgcc
pglobal
PGMLVL
pigz
pkeys
pkgconfig
pkgconfigdir
pkware
pkzip
pmqs
poffset
Pohland
Poltorak
Polushin
popl
popt
Posf
POSTINC
ppend
PPro
pqdownheap
pqremove
prevlen
procptr
PROT
Prouse
pswh
Pth
ptm
pufftest
puft
PULLBYTE
pushebp
pushebx
pushedi
pushesi
pushf
pushl
putbackfail
pwinerror
pwsh
Pzd
pziinit
pzlib
QDOS
Qing
qmaxmem
qnx
qpg
QPM
QSH
qshell
QSYS
Quines
raiter
randeg
ranlib
ravn
RAWLEN
rbp
rbrown
RCDLEN
RCFLAGS
rcs
rcx
rdi
rdpartysource
rdx
readabilty
readin
readmore
READWRITEFILTER
rearchitecting
recived
recomended
recompresses
recompressing
recreting
recsize
redhat
redistributable
referece
REGTYPE
Reinholdtsen
relativefilepath
remaing
reocmpression
REPZ
reseting
resourcestring
retval
rfc
rfm
rios
riscos
rocksoft
rodgers
rodin
roff
rommable
rpath
rpi
RSDS
rsi
rsp
rsxnt
rtl
rtti
Rudiak
Ruland
RWTH
Rzesniowiecki
Sangwine
sarl
Sarwate
sas
SASC
savefilenameinzip
scanalign
scanalignd
scanend
scanendw
scanstart
scanstartw
Schiffer
Schlafly
Schluper
Schrum
Schwaderer
schwardt
Schweda
scl
SCOPTIONS
scppc
SCRIPTDIR
securityfocus
seekable
segfault
Senisivity
setcompression
setcompressionlevel
setcompressionstrategy
setenv
setfiletime
setmode
settime
SFILES
SFLAGS
sfx
sgid
Shachar
SHAREDLIB
sharedlibdir
SHAREDLIBIMP
SHAREDLIBM
SHAREDLIBV
Shigeo
SHLIB
shll
shlq
shopt
SHORTNAMESIZE
shrl
shrq
Simplfy
simplied
sirena
Sirus
Sitebuilder
Siz
SIZECENTRALDIRITEM
SIZECENTRALHEADER
SIZEDATA
sizet
SIZEZIPLOCALHEADER
slib
Smake
SMakefile
SMALLBUFSIZE
Sobrado
somes
soname
sonda
sourcelen
SOVERSION
specfied
spetsified
Squeezeflags
srcdir
srcfil
SRCFILE
SRCMBR
SRCPF
SRCS
SRCSTMF
SRVPGM
startproc
stat'ing
STATBNDDIR
stategy
STATEm
STATEn
statep
STATEw
STATEx
STATICLIB
stdarg
STDC
stddef
stdint
STEDD
STMF
Stoks
strarg
strat
strcasecmp
strcmpcasenosensitive
STRCMPCASENOSENTIVEFUNCTION
strcmpi
strdup
streamp
strend
STREQUAL
strerror
STRICTUNZIP
STRICTZIP
STRICTZIPUNZIP
strm
STRMERGE
Stroustrup
STRPGMEXP
strstart
strtime
structore
strwinerror
subb
subl
subq
SUBREVISION
sunfreeware
Suport
suppors
suse
Svensson
svn
swtch
Symantec
syms
SYMTYPE
sync'ed
syncsearch
sysconfdir
SYSIFCOPT
systemnotsupported
SYSTEMTIME
Tagunz
Tagzip
Takanori
TAlloc
tarball
TARGETLIB
tarmode
tartime
TASM
taz
TBLS
tcc
tcl
TColor
TCompression
tconfig
tcrc
tcsh
TCustom
TDecompression
tds
Technolgies
tempdir
TEMPFILE
Tencent
Teredesai
Terje
testb
testdll
testerror
TESTFILE
testi
testl
testo
testreuslt
testshared
teststatic
testt
testw
testz
testzlib
Teterin
TFree
TGTCCSID
TGTRLS
tgz
tgzarchive
THL
Thorsen
Thorson
tlen
tlib
tmperr
tmphdrfile
tmpptr
tmpsh
tmpst
tmu
tmz
tmzip
TNotify
TObject
TOCCSID
TOOBJ
TOOFAR
Toolflags
TOPDIR
topt
Torok
Torri
Toshiaki
totin
totout
totsym
Tracec
Tracecv
Tracev
Tracevv
treebuild
Trenly
tristanpenman
trnlnm
Truta
tryboth
TRYFREE
tstream
tttt
TURBOC
txtvsbin
tyge
typedef'ed
typedefed
typedefs
TYPEDO
typeflag
ubbcluj
uch
uchf
Ucp
uder
udpate
ulg
ulongs
uncompr
uncompress
uncompressing
Uncompression
uncpr
uncpsize
uncrypt
undersubscribed
ungobbled
uninitialised
unistd
unixio
Unkn
untabify
untgz
unusued
unz
unzeof
unztell
updatewindow
upgradable
usenix
USEWIN
USEWINDOWS
ushf
UTILLIB
utimbuf
UWIN
UXP
vagul
Vainstein
Valgrind
varargs
varsize
vaxc
vaxcrtl
Vcdfimorst
VCL
vda
vec
VERNUM
VERSIONMADEBY
visualc
vlink
vmap
vmod
vms
vmsdefs
vnocompatwarnings
voidnp
voidp
voidpc
voidpf
VOLHDR
vollant
VPATH
vsconfig
vset
vstudio
Walles
Wassenhove
watcom
WATCOMC
wbits
wcc
WCE
wcl
wday
WDK
webdocs
weblogs
websites
Wegner
Weigelt
WFLAGS
whave
WIDECHAR
wikipedia
winapifamily
WINAPIV
windowbestlen
windowlen
windres
wingetutil
winimage
WINSIZE
winver
winzip
withoutpath
wlib
wmake
wmask
wnext
Wojciech
woot
wopen
wraplen
WRITEBUFFERSIZE
wsize
wustl
xar
xarch
xbits
xcode
XFL
xflag
xflgs
xlc
XLEN
xmlmultiple
xmm
xorl
xsom
xtarget
xtra
XTSTEP
xvmsutils
xxd
Yakimov
Yasuhiro
ycombinator
Zabolotny
zachary
zalloc
zbsm
ZCALLBACK
zcalloc
zcat
zcfree
zclose
zconfh
zconst
zcpr
ZCR
Zcrtdll
zdecode
zdef
zdll
zdoc
zencode
zerr
zerror
ZEXPORT
ZEXPORTVA
ZEXTERN
zfile
Zfname
zfree
zfstream
Zhu
ziinit
zilb
ZINCOUT
zinser
zipcharpc
zipfi
zipfile
zipfilename
zipfilenamearg
ziplib
zipok
zlb
zless
zlibd
zlibdefs
ZLIBIOAPI
zlibpas
zlibrc
zlibstatic
zlibvc
ZLIBWAPI
zmem
zmemcmp
zmemcpy
zmemzero
Znotfound
Zomf
zopen
Zouzou
zpipe
ZPOS
zprefix
zpull
zran
zread
zseek
zstate
zstream
zstreamp
zstrerror
zstringlen
zstrm
Zsuffix
ZSWAP
ztell
ztest
zutil
Zwin
zwrite
Previously acknowledged words that are now absent acl anonymized asm badbit Baz brk Buf CDEF cend cfr chcp ci Concat cstdint Ctx curated CYRL dirs dw endian enums EQU ERANGE errno fd FSharp ftp GES gitlab Google gz htm img IObject jp KF Kp langs LATN lhs Lifecycle llvm localhost lw lz memcpy middleware msdn multimap mx nullopt NX openmode pb psd psm px pz qb rbegin readonly rhs SARL Screenshot semver serializer streambuf strtoull SUSE textarea tpl typeof ubuntu uintptr ul UNSCOPED UPSERT uris URLs USHORT utils uuid virtualization vscode vy wcslen website wn Workflows zy :arrow_right:
Some files were automatically ignored

These sample patterns would exclude them:

^\Qsrc/PureLib/pure/AUTHORS\E$
^\Qsrc/PureLib/pure/zlib/contrib/blast/test.pk\E$
^\Qsrc/PureLib/pure/zlib/contrib/blast/test.txt\E$
^\Qsrc/PureLib/pure/zlib/contrib/masmx64/bld_ml64.bat\E$
^\Qsrc/PureLib/pure/zlib/contrib/puff/zeros.raw\E$

You should consider adding them to:

.github/actions/spelling/excludes.txt

File matching is via Perl regular expressions.

To check these files, more of their words need to be in the dictionary than not. You can use patterns.txt to exclude portions, add items to the dictionary (e.g. by adding them to allow.txt), or fix typos.

To accept ✔️ these unrecognized words as correct and remove the previously acknowledged and now absent words, run the following commands

... in a clone of the git@github.com:SirusCodes/winget-cli.git repository
on the #1620-spec branch (ℹ️ how do I use this?):

curl -s -S -L 'https://raw.githubusercontent.com/check-spelling/check-spelling/v0.0.21/apply.pl' |
perl - 'https://github.com/microsoft/winget-cli/actions/runs/3659581812/attempts/1'
Available 📚 dictionaries could cover words not in the 📘 dictionary

This includes both expected items (477) from .github/actions/spelling/expect.txt and unrecognized words (1679)

Dictionary Entries Covers
cspell:cpp/src/cpp.txt 30216 248
cspell:win32/src/win32.txt 53509 49
cspell:python/src/python/python-lib.txt 3873 32
cspell:php/php.txt 2597 32
cspell:java/java.txt 7642 31
cspell:python/src/common/extra.txt 741 13
cspell:r/src/r.txt 808 9
cspell:python/src/python/python.txt 453 8
cspell:golang/go.txt 3412 6
cspell:django/django.txt 859 6

Consider adding them using (in .github/workflows/spelling3.yml):

      with:
        extra_dictionaries:
          cspell:cpp/src/cpp.txt
          cspell:win32/src/win32.txt
          cspell:python/src/python/python-lib.txt
          cspell:php/php.txt
          cspell:java/java.txt
          cspell:python/src/common/extra.txt
          cspell:r/src/r.txt
          cspell:python/src/python/python.txt
          cspell:golang/go.txt
          cspell:django/django.txt

To stop checking additional dictionaries, add:

      with:
        check_extra_dictionaries: ''
Errors (4)

See the 📂 files view or the 📜action log for details.

❌ Errors Count
ℹ️ binary-file 2
❌ check-file-path 33
❌ forbidden-pattern 18
ℹ️ noisy-file 3

See ❌ Event descriptions for more information.

If the flagged items are false positives

If items relate to a ...

  • binary file (or some other file you wouldn't want to check at all).

    Please add a file path to the excludes.txt file matching the containing file.

    File paths are Perl 5 Regular Expressions - you can test yours before committing to verify it will match your files.

    ^ refers to the file's path from the root of the repository, so ^README\.md$ would exclude README.md (on whichever branch you're using).

  • well-formed pattern.

    If you can write a pattern that would match it,
    try adding it to the patterns.txt file.

    Patterns are Perl 5 Regular Expressions - you can test yours before committing to verify it will match your lines.

    Note that patterns can't match multiline strings.

@SirusCodes
Copy link
Author

@denelon, @yao-msft can you have a look?

@yao-msft
Copy link
Contributor

@denelon, @yao-msft can you have a look?

Hi @SirusCodes,

Thanks for your contribution and continued refinement of the spec. We are currently in the process of getting a release candidate of winget v1.4.0. We will get back to the spec when this feature work is scheduled.

Usually the spec will be checked in around the time implementation is done. And the spec might need to be modified and extended to match the actual implementation. I.e. features actually done, features moved to be considered in the future, a little description on the technical implementation like data schema, and expected behaviors and known issues, etc.

Thanks,
Yao

@bidaumm
Copy link

bidaumm commented Nov 1, 2023

It appears this has been stagnated since Dec '22
Is this still on the cards for future implementation?

@denelon
Copy link
Contributor

denelon commented Nov 1, 2023

Yes, we still want to offer an "interactive" mode for WinGet. We've been discussing several scenarios internally. This is one of the topics most likely to lead towards a WinGet 2.0.

Ideally, the default behavior for that version of WinGet will support better interactive experiences for users. We're also very aware of the desire to have non-interactive scripted experiences. We've been discussing the impact for automated scenarios and how we would have the client respond so scripted behaviors could more easily isolate the failures encountered by interruptions caused by interactive prompts expecting a user to respond.

If we offer the interactive experience as an option a user could "opt-in" we would need to figure out the best way to help them discover this new mode. We would certainly need settings and command-line arguments to toggle the behavior as a default mode as well as an override option.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

5 participants