@floh-solutions/pharos-cli 0.24.0 → 0.26.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +97 -10
- package/dist/adopt-type.d.ts +58 -0
- package/dist/adopt-type.d.ts.map +1 -0
- package/dist/adopt-type.js +61 -0
- package/dist/adopt-type.js.map +1 -0
- package/dist/bridge.d.ts +156 -0
- package/dist/bridge.d.ts.map +1 -0
- package/dist/bridge.js +157 -0
- package/dist/bridge.js.map +1 -0
- package/dist/cli.d.ts +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +176 -31
- package/dist/cli.js.map +1 -1
- package/dist/commands/bridge.d.ts +30 -0
- package/dist/commands/bridge.d.ts.map +1 -0
- package/dist/commands/bridge.js +255 -0
- package/dist/commands/bridge.js.map +1 -0
- package/dist/commands/comment-github.d.ts +138 -0
- package/dist/commands/comment-github.d.ts.map +1 -0
- package/dist/commands/comment-github.js +427 -0
- package/dist/commands/comment-github.js.map +1 -0
- package/dist/commands/comment.d.ts.map +1 -1
- package/dist/commands/comment.js +114 -19
- package/dist/commands/comment.js.map +1 -1
- package/dist/commands/doctor.d.ts +169 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +241 -44
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/issue.d.ts +133 -0
- package/dist/commands/issue.d.ts.map +1 -1
- package/dist/commands/issue.js +292 -110
- package/dist/commands/issue.js.map +1 -1
- package/dist/commands/setup.d.ts +45 -0
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +74 -0
- package/dist/commands/setup.js.map +1 -1
- package/dist/half-link.d.ts +14 -4
- package/dist/half-link.d.ts.map +1 -1
- package/dist/half-link.js +14 -4
- package/dist/half-link.js.map +1 -1
- package/dist/output.d.ts.map +1 -1
- package/dist/output.js +123 -1
- package/dist/output.js.map +1 -1
- package/dist/session.d.ts +51 -2
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +62 -11
- package/dist/session.js.map +1 -1
- package/dist/target.d.ts +40 -4
- package/dist/target.d.ts.map +1 -1
- package/dist/target.js +14 -3
- package/dist/target.js.map +1 -1
- package/package.json +4 -4
- package/skill/SKILL.md +167 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"comment.js","sourceRoot":"","sources":["../../src/commands/comment.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,UAAU,EAA0B,MAAM,cAAc,CAAC;AACxE,OAAO,EAAE,OAAO,EAAgB,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,WAAW,EAAe,MAAM,cAAc,CAAC;AAExE;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,MAAM,SAAS,GAA+B;IAC5C,MAAM;IACN,SAAS;IACT,OAAO;IACP,QAAQ;IACR,OAAO;IACP,UAAU;CACX,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,EAAM,EACN,OAAgB,EAChB,WAA8B,EAC9B,KAAoC;IAEpC,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IAC5B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,UAAU,CAAC,mEAAmE,CAAC,CAAC;IACxF,CAAC;IAED,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IACjC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,MAAM,UAAU,CACd,iCAAiC,IAAI,oDAAoD;cACrF,oBAAoB,CACzB,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAElC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,MAAM;YACT,OAAO,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QACnC,KAAK,KAAK;YACR,OAAO,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACjE,KAAK,MAAM;YACT,OAAO,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACtF,KAAK,QAAQ;YACX,OAAO,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzD,KAAK,OAAO;YACV,OAAO,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QACrF,KAAK,SAAS;YACZ,OAAO,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACtF,KAAK,UAAU;YACb,OAAO,QAAQ,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClF;YACE,MAAM,UAAU,CACd,yBAAyB,IAAI,6DAA6D,CAC3F,CAAC;IACN,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI,CAAC,EAAM,EAAE,OAAgB,EAAE,MAAc;IAC1D,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QACrF,OAAO,IAAI,CACT,EAAE,EACF,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACzB,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,WAAW;YACzC,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC,CAAC,CACJ,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAClD,4EAA4E;IAC5E,0DAA0D;IAC1D,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACzE,OAAO,IAAI,CACT,EAAE,EACF,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACzB,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,WAAW;QACzC,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAC/C,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,KAAK,EAAE,QAAQ,CAAC,KAAK;SACtB,CAAC,CAAC;KACJ,CAAC,CAAC,CACJ,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,GAAG,CAChB,EAAM,EACN,OAAgB,EAChB,MAAc,EACd,IAAY;IAEZ,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC5E,OAAO,IAAI,CAAC,EAAE,EAAE;QACd,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC;QAC9B,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,SAAS,EAAE,OAAO,CAAC,EAAE;KACtB,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,IAAI,CACjB,EAAM,EACN,OAAgB,EAChB,MAAc,EACd,EAAU,EACV,IAAY;IAEZ,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;QAC1E,OAAO,IAAI,CAAC,EAAE,EAAE;YACd,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC;YAC9B,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IACjF,OAAO,IAAI,CAAC,EAAE,EAAE;QACd,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC;QAC9B,SAAS,EAAE,OAAO,CAAC,EAAE;QACrB,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,EAAM,EAAE,OAAgB,EAAE,MAAc,EAAE,EAAU;IACxE,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE;QAChC,IAAI,EAAE,kBAAkB,EAAE,OAAO,cAAc,CAAC,MAAM,CAAC,EAAE;QACzD,KAAK,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE;KAClF,CAAC,CAAC;IACH,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAEpC,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC/B,MAAM,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACtD,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,6EAA6E;IAC7E,8EAA8E;IAC9E,OAAO,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;AACvG,CAAC;AAED,KAAK,UAAU,KAAK,CAClB,EAAM,EACN,OAAgB,EAChB,MAAc,EACd,EAAU,EACV,IAAqB,EACrB,EAAW;IAEX,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,EAAE;YACjB,CAAC,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC;YAC1D,CAAC,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;QAC/D,OAAO,IAAI,CAAC,EAAE,EAAE;YACd,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC;YAC9B,SAAS,EAAE,EAAE;YACb,IAAI;YACJ,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,oBAAoB,EAAE,QAAQ,CAAC,oBAAoB;SACpD,CAAC,CAAC;IACL,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAClD,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,MAAM,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;QAC7D,OAAO,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IACpG,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IAC5E,OAAO,IAAI,CAAC,EAAE,EAAE;QACd,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC;QAC9B,SAAS,EAAE,EAAE;QACb,IAAI;QACJ,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,oBAAoB,EAAE,QAAQ,CAAC,oBAAoB;KACpD,CAAC,CAAC;AACL,CAAC;AAED,gFAAgF;AAChF,KAAK,UAAU,QAAQ,CACrB,EAAM,EACN,OAAgB,EAChB,MAAc,EACd,EAAU,EACV,IAAqB;IAErB,MAAM,UAAU,GACd,MAAM,CAAC,IAAI,KAAK,UAAU;QACxB,CAAC,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC;QAC7D,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;YAChB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YAClD,OAAO,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;QACjE,CAAC,CAAC,EAAE,CAAC;IAEX,OAAO,IAAI,CACT,EAAE,EACF,UAAU,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC5B,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,UAAU,EAAE,QAAQ,CAAC,UAAU;KAChC,CAAC,CAAC,CACJ,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,QAAQ,CACrB,OAAgB,EAChB,IAAY;IAEZ,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,cAAc,EAAE,CAAC;IAC5C,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACrD,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,UAAU,CAAC,iBAAiB,IAAI,kDAAkD,CAAC,CAAC;IAC5F,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;AACxC,CAAC;AAED,SAAS,SAAS,CAAC,GAAuB;IACxC,IAAI,GAAG,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5C,MAAM,UAAU,CAAC,6CAA6C,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC;IAC/G,CAAC;IACD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC;AAED,SAAS,YAAY,CAAC,GAAuB;IAC3C,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,MAAM,UAAU,CAAC,2BAA2B,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvE,CAAC;IACD,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC;IACrD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,UAAU,CAAC,IAAI,GAAG,gCAAgC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YAC/E,SAAS,EAAE,SAAS;SACrB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,QAAQ,CAAC,UAA8B,EAAE,QAA4B;IAC5E,MAAM,IAAI,GAAG,UAAU,IAAI,QAAQ,CAAC;IACpC,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC7C,MAAM,UAAU,CACd,0FAA0F,CAC3F,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
1
|
+
{"version":3,"file":"comment.js","sourceRoot":"","sources":["../../src/commands/comment.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,UAAU,EAA0B,MAAM,cAAc,CAAC;AACxE,OAAO,EAAE,OAAO,EAAgB,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,WAAW,EAAkB,MAAM,cAAc,CAAC;AAC3E,OAAO,EACL,UAAU,EACV,UAAU,EACV,SAAS,EACT,WAAW,EACX,cAAc,EACd,eAAe,EACf,YAAY,EACZ,UAAU,EACV,kBAAkB,EAClB,wBAAwB,GAEzB,MAAM,qBAAqB,CAAC;AAE7B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AAEH,MAAM,SAAS,GAA+B;IAC5C,MAAM;IACN,SAAS;IACT,OAAO;IACP,QAAQ;IACR,OAAO;IACP,UAAU;CACX,CAAC;AAEF,MAAM,KAAK,GAAG;IACZ,MAAM;IACN,KAAK;IACL,MAAM;IACN,QAAQ;IACR,OAAO;IACP,SAAS;IACT,UAAU;IACV,MAAM;IACN,QAAQ;IACR,KAAK;IACL,OAAO;CACC,CAAC;AAEX,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,EAAM,EACN,OAAgB,EAChB,WAA8B,EAC9B,KAAoC;IAEpC,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IAC5B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,UAAU,CAAC,qBAAqB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IACjC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,MAAM,UAAU,CACd,iCAAiC,IAAI,kDAAkD;cACnF,4DAA4D,CACjE,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAElC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,MAAM;YACT,IAAI,MAAM,CAAC,IAAI,KAAK,aAAa;gBAAE,OAAO,UAAU,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YAChF,OAAO,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QACnC,KAAK,KAAK;YACR,IAAI,MAAM,CAAC,IAAI,KAAK,aAAa;gBAAE,OAAO,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACxE,OAAO,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACjE,KAAK,MAAM;YACT,IAAI,MAAM,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;gBAClC,OAAO,UAAU,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YAC/F,CAAC;YACD,OAAO,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACtF,KAAK,QAAQ;YACX,IAAI,MAAM,CAAC,IAAI,KAAK,aAAa;gBAAE,OAAO,YAAY,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACnG,OAAO,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzD,KAAK,OAAO,CAAC;QACb,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,EAAE,GAAG,IAAI,KAAK,OAAO,CAAC;YAC5B,IAAI,MAAM,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;gBAClC,OAAO,WAAW,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC9E,CAAC;YACD,OAAO,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACnF,CAAC;QACD,KAAK,UAAU;YACb,IAAI,MAAM,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;gBAClC,OAAO,cAAc,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7E,CAAC;YACD,OAAO,QAAQ,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClF,2EAA2E;QAC3E,2EAA2E;QAC3E,mDAAmD;QACnD,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAI,MAAM,CAAC,IAAI,KAAK,aAAa;gBAAE,MAAM,wBAAwB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAChF,OAAO,UAAU,CACf,EAAE,EACF,OAAO,EACP,MAAM,CAAC,KAAK,EACZ,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EACf,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAC1D,CAAC;QACJ,CAAC;QACD,KAAK,KAAK,CAAC;QACX,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,IAAI,MAAM,CAAC,IAAI,KAAK,aAAa;gBAAE,MAAM,wBAAwB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAChF,OAAO,SAAS,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,KAAK,CAAC,CAAC;QAC/E,CAAC;QACD;YACE,MAAM,UAAU,CAAC,yBAAyB,IAAI,UAAU,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;gBAC3E,KAAK,EAAE,KAAK;aACb,CAAC,CAAC;IACP,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI,CAAC,EAAM,EAAE,OAAgB,EAAE,MAAiB;IAC7D,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QACrF,OAAO,IAAI,CACT,EAAE,EACF,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACzB,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,WAAW;YACzC,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC,CAAC,CACJ,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAClD,4EAA4E;IAC5E,0DAA0D;IAC1D,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACzE,OAAO,IAAI,CACT,EAAE,EACF,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACzB,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,WAAW;QACzC,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAC/C,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,KAAK,EAAE,QAAQ,CAAC,KAAK;SACtB,CAAC,CAAC;KACJ,CAAC,CAAC,CACJ,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,GAAG,CAChB,EAAM,EACN,OAAgB,EAChB,MAAiB,EACjB,IAAY;IAEZ,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC5E,OAAO,IAAI,CAAC,EAAE,EAAE;QACd,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC;QAC9B,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,SAAS,EAAE,OAAO,CAAC,EAAE;KACtB,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,IAAI,CACjB,EAAM,EACN,OAAgB,EAChB,MAAiB,EACjB,EAAU,EACV,IAAY;IAEZ,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;QAC1E,OAAO,IAAI,CAAC,EAAE,EAAE;YACd,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC;YAC9B,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IACjF,OAAO,IAAI,CAAC,EAAE,EAAE;QACd,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC;QAC9B,SAAS,EAAE,OAAO,CAAC,EAAE;QACrB,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,EAAM,EAAE,OAAgB,EAAE,MAAiB,EAAE,EAAU;IAC3E,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE;QAChC,IAAI,EAAE,kBAAkB,EAAE,OAAO,cAAc,CAAC,MAAM,CAAC,EAAE;QACzD,KAAK,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE;KAClF,CAAC,CAAC;IACH,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAEpC,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC/B,MAAM,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACtD,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,6EAA6E;IAC7E,8EAA8E;IAC9E,OAAO,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;AACvG,CAAC;AAED,KAAK,UAAU,KAAK,CAClB,EAAM,EACN,OAAgB,EAChB,MAAiB,EACjB,EAAU,EACV,IAAqB,EACrB,EAAW;IAEX,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,EAAE;YACjB,CAAC,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC;YAC1D,CAAC,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;QAC/D,OAAO,IAAI,CAAC,EAAE,EAAE;YACd,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC;YAC9B,SAAS,EAAE,EAAE;YACb,IAAI;YACJ,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,oBAAoB,EAAE,QAAQ,CAAC,oBAAoB;SACpD,CAAC,CAAC;IACL,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAClD,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,MAAM,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;QAC7D,OAAO,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IACpG,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IAC5E,OAAO,IAAI,CAAC,EAAE,EAAE;QACd,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC;QAC9B,SAAS,EAAE,EAAE;QACb,IAAI;QACJ,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,oBAAoB,EAAE,QAAQ,CAAC,oBAAoB;KACpD,CAAC,CAAC;AACL,CAAC;AAED,gFAAgF;AAChF,KAAK,UAAU,QAAQ,CACrB,EAAM,EACN,OAAgB,EAChB,MAAiB,EACjB,EAAU,EACV,IAAqB;IAErB,MAAM,UAAU,GACd,MAAM,CAAC,IAAI,KAAK,UAAU;QACxB,CAAC,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC;QAC7D,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;YAChB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YAClD,OAAO,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;QACjE,CAAC,CAAC,EAAE,CAAC;IAEX,OAAO,IAAI,CACT,EAAE,EACF,UAAU,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC5B,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,UAAU,EAAE,QAAQ,CAAC,UAAU;KAChC,CAAC,CAAC,CACJ,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,QAAQ,CACrB,OAAgB,EAChB,IAAY;IAEZ,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,cAAc,EAAE,CAAC;IAC5C,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACrD,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,UAAU,CAAC,iBAAiB,IAAI,kDAAkD,CAAC,CAAC;IAC5F,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;AACxC,CAAC;AAED,SAAS,SAAS,CAAC,GAAuB;IACxC,IAAI,GAAG,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5C,MAAM,UAAU,CAAC,6CAA6C,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC;IAC/G,CAAC;IACD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,SAAS,MAAM,CAAC,GAAuB;IACrC,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC3C,MAAM,UAAU,CACd,kFAAkF;cAC9E,8CAA8C,CACnD,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IACzB,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;QACxB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE;QACrC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AACtC,CAAC;AAED,SAAS,YAAY,CAAC,GAAuB;IAC3C,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,MAAM,UAAU,CAAC,2BAA2B,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvE,CAAC;IACD,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC;IACrD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,UAAU,CAAC,IAAI,GAAG,gCAAgC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YAC/E,SAAS,EAAE,SAAS;SACrB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,QAAQ,CAAC,UAA8B,EAAE,QAA4B;IAC5E,MAAM,IAAI,GAAG,UAAU,IAAI,QAAQ,CAAC;IACpC,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC7C,MAAM,UAAU,CACd,0FAA0F,CAC3F,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { GhAccount, GitHubClient, RepoBinding } from "@floh-solutions/gh-core";
|
|
1
2
|
import { type ExitCode, type Io } from "../output.js";
|
|
2
3
|
/**
|
|
3
4
|
* `pharos doctor` — what is installed, what is missing, and what each missing
|
|
@@ -50,5 +51,173 @@ export interface DoctorCommandOptions {
|
|
|
50
51
|
/** Also prove the token against Azure DevOps. Costs two requests. */
|
|
51
52
|
verify: boolean;
|
|
52
53
|
}
|
|
54
|
+
export interface Check {
|
|
55
|
+
id: string;
|
|
56
|
+
name: string;
|
|
57
|
+
tier: 0 | 1 | 2;
|
|
58
|
+
/** Plain-language: what having this gets you. Rendered as-is by a GUI. */
|
|
59
|
+
unlocks: string;
|
|
60
|
+
/** What is lost without it — never "it is broken" when it is not. */
|
|
61
|
+
without: string;
|
|
62
|
+
ok: boolean;
|
|
63
|
+
version: string | null;
|
|
64
|
+
path: string | null;
|
|
65
|
+
/** The command that would install it here, or null when we cannot say. */
|
|
66
|
+
install: string | null;
|
|
67
|
+
/** Set when something needs saying beyond present/absent. */
|
|
68
|
+
note?: string;
|
|
69
|
+
/**
|
|
70
|
+
* **`gh-auth` only: does `repos.json` list at least one binding?** (#892)
|
|
71
|
+
*
|
|
72
|
+
* `true` when it lists one or more, `false` when it lists none or does not
|
|
73
|
+
* exist. **Absent** on every other check, on an older CLI, and — deliberately
|
|
74
|
+
* — in the two states where the answer was never established: `gh` missing
|
|
75
|
+
* (the config is not read at all) and a `repos.json` that could not be
|
|
76
|
+
* parsed, where "lists none" and "lists plenty" are indistinguishable.
|
|
77
|
+
* Absent means *not known*, never `false`; that is the same trap `gh` sets
|
|
78
|
+
* with an empty `scopes` on a non-`valid` account.
|
|
79
|
+
*
|
|
80
|
+
* It exists because the app cannot get this fact any other way without
|
|
81
|
+
* breaking a rule. `gh-auth` is `ok: true` whenever gh holds healthy
|
|
82
|
+
* credentials, so on the wizard's success path the row is green and its note
|
|
83
|
+
* is suppressed — and the "No repository is bound yet" sentence goes with it.
|
|
84
|
+
* The obvious fix, rendering the note when it *contains* that sentence, is
|
|
85
|
+
* prose sniffing: `CommandLineTools.swift` renders a row per id and never
|
|
86
|
+
* reads English, precisely so that rewording a note cannot silently break a
|
|
87
|
+
* GUI. So the fact travels as a field.
|
|
88
|
+
*
|
|
89
|
+
* Not a check of its own, either: `gh-repo-bound` would be permanently red on
|
|
90
|
+
* every machine that has `gh` for ordinary git work and does not want the
|
|
91
|
+
* bridge, which is the red-row-nobody-reads this whole section avoids.
|
|
92
|
+
*/
|
|
93
|
+
bound?: boolean;
|
|
94
|
+
/** Per-account detail for `gh-account`. See {@link AccountReport}. */
|
|
95
|
+
accounts?: AccountReport[];
|
|
96
|
+
/** Per-repository detail for `gh-repo-access`. See {@link RepoReport}. */
|
|
97
|
+
repos?: RepoReport[];
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* One configured GitHub account, and whether `gh` still holds a token for it.
|
|
101
|
+
*
|
|
102
|
+
* **`active` is reported and never acted on.** On the machine plan §2 was
|
|
103
|
+
* measured on, the account a project is bound to is *not* the active one, so a
|
|
104
|
+
* report that omitted this would be unreadable the first time it disagreed with
|
|
105
|
+
* what `gh auth status` prints by hand.
|
|
106
|
+
*/
|
|
107
|
+
export interface AccountReport {
|
|
108
|
+
account: string;
|
|
109
|
+
ok: boolean;
|
|
110
|
+
/** What `gh` calls active, or null when `gh auth status` could not say. */
|
|
111
|
+
active: boolean | null;
|
|
112
|
+
detail: string;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* One configured repository, reached **as its configured account**.
|
|
116
|
+
*
|
|
117
|
+
* `resolved` and `nodeId` are the point: a 200 proves nothing on a machine with
|
|
118
|
+
* two accounts, because `owner/widgets` can exist under both. What GitHub
|
|
119
|
+
* answered with is recorded so the mismatch is a fact rather than an inference.
|
|
120
|
+
*/
|
|
121
|
+
export interface RepoReport {
|
|
122
|
+
repo: string;
|
|
123
|
+
account: string;
|
|
124
|
+
/**
|
|
125
|
+
* Access was **proven**. `false` is therefore "not proven", which is wider
|
|
126
|
+
* than "broken": `problem: "unreachable"` lands here having judged nothing.
|
|
127
|
+
* Anything rendering this must read `problem` before drawing a failure.
|
|
128
|
+
*/
|
|
129
|
+
ok: boolean;
|
|
130
|
+
/** Who the token turned out to belong to — `gh api user`'s login. */
|
|
131
|
+
viewer: string | null;
|
|
132
|
+
/** The `full_name` GitHub actually returned. */
|
|
133
|
+
resolved: string | null;
|
|
134
|
+
/** GitHub's node id for it: the identity that survives a rename. */
|
|
135
|
+
nodeId: string | null;
|
|
136
|
+
/**
|
|
137
|
+
* `gh-core`'s closed set: no-token | unauthorized | not-visible |
|
|
138
|
+
* wrong-repository | issues-disabled | archived | **unreachable** | unknown.
|
|
139
|
+
*
|
|
140
|
+
* `unreachable` is the one that is not a fault — no answer was obtained, so
|
|
141
|
+
* neither the binding nor the credential was judged. It is the `gh-auth`
|
|
142
|
+
* row's `unverified` in a different vocabulary, and the check stays green on
|
|
143
|
+
* it.
|
|
144
|
+
*/
|
|
145
|
+
problem: string | null;
|
|
146
|
+
detail: string | null;
|
|
147
|
+
}
|
|
53
148
|
export declare function runDoctor(io: Io, env: NodeJS.ProcessEnv, options: DoctorCommandOptions, pretty: boolean, version: string): Promise<ExitCode>;
|
|
149
|
+
/**
|
|
150
|
+
* `gh` is fine and nothing is bound — say so **as data** on the `gh-auth` row
|
|
151
|
+
* (#892), and name the command that fixes it **as data** too (#890).
|
|
152
|
+
*
|
|
153
|
+
* Its own function because of the one rule inside it that a test cannot reach
|
|
154
|
+
* through `pharos doctor`: **an existing `install` is never overwritten.** The
|
|
155
|
+
* state that matters is a credential GitHub has actively REFUSED — `authCheck`
|
|
156
|
+
* puts `gh auth login --user <login>` on the row for it — and binding a
|
|
157
|
+
* repository to a dead token achieves nothing, so that command outranks this
|
|
158
|
+
* one. Replacing it would be #886's mistake (naming the wrong command with
|
|
159
|
+
* confidence) committed in the row directly above #886's.
|
|
160
|
+
*
|
|
161
|
+
* Arranging a refused credential on a real machine is not something a test may
|
|
162
|
+
* do, so the precedence is asserted here instead, against a synthesised row.
|
|
163
|
+
*/
|
|
164
|
+
export declare function markUnbound(auth: Check, configPath: string, configExists: boolean, held?: readonly GhAccount[]): void;
|
|
165
|
+
/** The `gh-auth` row, worded by which of the three states we are actually in. */
|
|
166
|
+
export declare function authCheck(base: Omit<Check, "ok" | "install">, accounts: readonly GhAccount[], accountReports: readonly AccountReport[], authFailure: string | undefined): Check;
|
|
167
|
+
/**
|
|
168
|
+
* `gh-repo-access` — **the one that a status code cannot answer.**
|
|
169
|
+
*
|
|
170
|
+
* Plan §2: with two `gh` accounts in play, `owner/widgets` can exist under both,
|
|
171
|
+
* so the wrong identity returns a perfectly good 200 for a different
|
|
172
|
+
* repository. `verifyAccess` compares the `full_name` GitHub answered with
|
|
173
|
+
* against what was configured; this records the account it asked as, the viewer
|
|
174
|
+
* that token turned out to be, and the node id — the identity that survives a
|
|
175
|
+
* rename — so a disagreement is a fact on the page rather than an inference.
|
|
176
|
+
*
|
|
177
|
+
* ## It is also the one row that makes real calls, so it can fail to ask (#886)
|
|
178
|
+
*
|
|
179
|
+
* This is the only GitHub row that needs the network — which means it is the
|
|
180
|
+
* only one that can be offline, and the first draft reported that as a fault.
|
|
181
|
+
* `gh-core` returned `unknown` for a dead socket, and `unknown` landed in the
|
|
182
|
+
* `else` below as {@link BIND_COMMAND}: **run the wizard on a plane and it told
|
|
183
|
+
* you to re-record a binding that was perfectly correct.**
|
|
184
|
+
*
|
|
185
|
+
* {@link authCheck} had already met this exactly one layer up and answered it —
|
|
186
|
+
* an `unverified` account is reported as not-a-fault and is deliberately NOT
|
|
187
|
+
* offered `gh auth login`, because sending somebody to re-authenticate over the
|
|
188
|
+
* network that is itself the problem is the original bug wearing a new hat.
|
|
189
|
+
* That reasoning is not about credentials specifically; it is about the
|
|
190
|
+
* difference between "we asked and the answer was no" and "we could not ask".
|
|
191
|
+
* `gh-core` now spells the second one `unreachable`, and this row treats it the
|
|
192
|
+
* same way `gh-auth` treats `unverified`:
|
|
193
|
+
*
|
|
194
|
+
* - the check is **green**, because nothing here is broken;
|
|
195
|
+
* - `install` is **null**, because no command would help — offering the wrong
|
|
196
|
+
* one is worse than offering none;
|
|
197
|
+
* - the note says *could not ask*, never *failed*.
|
|
198
|
+
*
|
|
199
|
+
* The per-repository row keeps `ok: false` with `problem: "unreachable"`, which
|
|
200
|
+
* is the honest pair: access was not proven, and it was not disproven either.
|
|
201
|
+
* A consumer rendering `repos` must branch on `problem` rather than paint every
|
|
202
|
+
* `ok: false` red — {@link render} below does, and the app's wizard step
|
|
203
|
+
* (`CommandLineStep.swift`, todo #888) has to as well.
|
|
204
|
+
*
|
|
205
|
+
* A **mixed** run still fails, and that is the point of separating them rather
|
|
206
|
+
* than counting: one repository unreachable and another genuinely unauthorized
|
|
207
|
+
* is a real fault with a real fix, and the fix is named for the fault.
|
|
208
|
+
*/
|
|
209
|
+
export declare function repoAccessCheck(client: GitHubClient, bindings: readonly RepoBinding[], configPath: string): Promise<Check>;
|
|
210
|
+
/**
|
|
211
|
+
* The mark beside one repository — and there are **three** of them, not two.
|
|
212
|
+
*
|
|
213
|
+
* `ok: false` covers two different states (#886): GitHub gave a verdict and it
|
|
214
|
+
* was no, and nobody could be asked at all. Printing `✗` against an unreachable
|
|
215
|
+
* host is the same overclaim in ink that `install: BIND_COMMAND` was in JSON —
|
|
216
|
+
* a broken-looking line underneath a check that has just said it is fine. `?`
|
|
217
|
+
* is the state `gh` itself calls `unverified`.
|
|
218
|
+
*
|
|
219
|
+
* Its own function because it is the assertable half of that decision, and
|
|
220
|
+
* `render` is not reachable from a test without a machine in a known state.
|
|
221
|
+
*/
|
|
222
|
+
export declare function repoMark(repo: Pick<RepoReport, "ok" | "problem">): "✓" | "?" | "✗";
|
|
54
223
|
//# sourceMappingURL=doctor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/doctor.js
CHANGED
|
@@ -454,21 +454,39 @@ async function verifyScopes(env, configured) {
|
|
|
454
454
|
* ## Why `gh-auth` never says "you are signed out"
|
|
455
455
|
*
|
|
456
456
|
* **Measured on gh 2.87.3.** `gh auth status` validates every token against
|
|
457
|
-
* github.com
|
|
458
|
-
*
|
|
459
|
-
*
|
|
460
|
-
*
|
|
461
|
-
*
|
|
462
|
-
*
|
|
463
|
-
*
|
|
464
|
-
*
|
|
465
|
-
*
|
|
466
|
-
*
|
|
467
|
-
*
|
|
468
|
-
*
|
|
469
|
-
*
|
|
470
|
-
*
|
|
471
|
-
*
|
|
457
|
+
* github.com, and with the host unreachable it words a connectivity fault as a
|
|
458
|
+
* credential fault: `X Failed to log in to github.com account ASNNetworks` /
|
|
459
|
+
* `The token in keyring is invalid`. A check that repeated that would tell
|
|
460
|
+
* somebody on a plane to run `gh auth login`, which is the one thing that cannot
|
|
461
|
+
* work there.
|
|
462
|
+
*
|
|
463
|
+
* **#793 has since landed in `gh-core`**, and it changed the shape of the
|
|
464
|
+
* problem rather than removing it. `gh auth status --json hosts` lists every
|
|
465
|
+
* account whatever happens, each carrying a `state`:
|
|
466
|
+
*
|
|
467
|
+
* | `state` | what it means | what to tell somebody |
|
|
468
|
+
* |---|---|---|
|
|
469
|
+
* | `valid` | GitHub answered for this token | nothing |
|
|
470
|
+
* | `rejected` | GitHub answered **401/403** — the credential really is bad | `gh auth login --user <login>` |
|
|
471
|
+
* | `unverified` | nobody judged it: host unreachable, GitHub erred, or `gh` too old | check the network, **not** the credential |
|
|
472
|
+
*
|
|
473
|
+
* So the failure this section was written about — an empty list on a machine
|
|
474
|
+
* holding two accounts — no longer happens for an unreachable host. **The
|
|
475
|
+
* hazard moved**: a listed account is no longer the same thing as a working
|
|
476
|
+
* one, and reading `accounts.length > 0` as "signed in" now reports a token
|
|
477
|
+
* GitHub has actively refused as healthy. {@link authCheck} branches on `state`
|
|
478
|
+
* for that reason.
|
|
479
|
+
*
|
|
480
|
+
* An empty list is still possible and still a disjunction, because `gh auth
|
|
481
|
+
* status` reads `$XDG_CONFIG_HOME/gh/hosts.yml` while `gh auth token --user`
|
|
482
|
+
* reads the keyring — a moved or overridden `GH_CONFIG_DIR` empties the first
|
|
483
|
+
* and not the second. The keyring cross-check below stays for that case, which
|
|
484
|
+
* is the only one it was ever able to settle.
|
|
485
|
+
*
|
|
486
|
+
* **One trap when reading an account:** `scopes` is empty whenever `state` is
|
|
487
|
+
* not `valid`, because `gh` takes them off the `X-OAuth-Scopes` *response*
|
|
488
|
+
* header. Empty means *not known*, never "no scopes" — the same overclaim as
|
|
489
|
+
* the original bug, one field along. Check `state` first.
|
|
472
490
|
*
|
|
473
491
|
* ## What is emitted, and what is deliberately not
|
|
474
492
|
*
|
|
@@ -563,14 +581,10 @@ async function githubChecks(env, gh, verify) {
|
|
|
563
581
|
return checks;
|
|
564
582
|
}
|
|
565
583
|
if (bindings.length === 0) {
|
|
566
|
-
|
|
567
|
-
auth.note =
|
|
568
|
-
`${auth.note ?? ""} No repository is bound yet — `
|
|
569
|
-
+ `${configExists ? `${configPath} lists none` : `${configPath} does not exist`}. `
|
|
570
|
-
+ `\`${BIND_COMMAND}\` binds one, and \`gh-account\` and \`gh-repo-access\` appear `
|
|
571
|
-
+ "once it does.";
|
|
584
|
+
markUnbound(checks[0], configPath, configExists, accounts);
|
|
572
585
|
return checks;
|
|
573
586
|
}
|
|
587
|
+
checks[0].bound = true;
|
|
574
588
|
const accountsOk = accountReports.every((report) => report.ok);
|
|
575
589
|
checks.push({
|
|
576
590
|
id: "gh-account",
|
|
@@ -598,8 +612,60 @@ const ACCOUNT_UNLOCKS = "Every bound repository is reached as the account bound
|
|
|
598
612
|
+ "happens to have active.";
|
|
599
613
|
const ACCOUNT_WITHOUT = "`pharos issue` fails on that repository with an account error rather than a GitHub outage.";
|
|
600
614
|
const BIND_COMMAND = "pharos setup --repo owner/name --gh-account <login>";
|
|
615
|
+
/**
|
|
616
|
+
* `gh` is fine and nothing is bound — say so **as data** on the `gh-auth` row
|
|
617
|
+
* (#892), and name the command that fixes it **as data** too (#890).
|
|
618
|
+
*
|
|
619
|
+
* Its own function because of the one rule inside it that a test cannot reach
|
|
620
|
+
* through `pharos doctor`: **an existing `install` is never overwritten.** The
|
|
621
|
+
* state that matters is a credential GitHub has actively REFUSED — `authCheck`
|
|
622
|
+
* puts `gh auth login --user <login>` on the row for it — and binding a
|
|
623
|
+
* repository to a dead token achieves nothing, so that command outranks this
|
|
624
|
+
* one. Replacing it would be #886's mistake (naming the wrong command with
|
|
625
|
+
* confidence) committed in the row directly above #886's.
|
|
626
|
+
*
|
|
627
|
+
* Arranging a refused credential on a real machine is not something a test may
|
|
628
|
+
* do, so the precedence is asserted here instead, against a synthesised row.
|
|
629
|
+
*/
|
|
630
|
+
export function markUnbound(auth, configPath, configExists, held = []) {
|
|
631
|
+
// **The accounts `gh` holds, as data, in the one state where nothing else
|
|
632
|
+
// reports them** (#889). `gh-account` carries the per-binding list, but it is
|
|
633
|
+
// emitted only once a repository is bound — so on an unbound machine, which is
|
|
634
|
+
// exactly when somebody needs to choose an account to bind AS, the app had no
|
|
635
|
+
// decoded list of accounts at all and could only have scraped this note.
|
|
636
|
+
//
|
|
637
|
+
// Attached here rather than on every `gh-auth` row so the wizard never draws
|
|
638
|
+
// the same accounts twice: once bound, `gh-account` owns that display.
|
|
639
|
+
if (held.length > 0) {
|
|
640
|
+
auth.accounts = held.map((account) => ({
|
|
641
|
+
account: account.login,
|
|
642
|
+
// Listed is not the same as working (#793): a REJECTED credential is one
|
|
643
|
+
// GitHub has actively refused, and binding a repository to it achieves
|
|
644
|
+
// nothing. The picker uses this to refuse the account rather than to hide
|
|
645
|
+
// it — a missing account is a question, a refused one is an answer.
|
|
646
|
+
ok: account.state !== "rejected",
|
|
647
|
+
active: account.active,
|
|
648
|
+
detail: account.state === "rejected"
|
|
649
|
+
? `GitHub refused this credential${account.stateDetail === undefined ? "" : ` — ${account.stateDetail}`}.`
|
|
650
|
+
: `gh holds a token for "${account.login}".`,
|
|
651
|
+
}));
|
|
652
|
+
}
|
|
653
|
+
auth.note =
|
|
654
|
+
`${auth.note ?? ""} No repository is bound yet — `
|
|
655
|
+
+ `${configExists ? `${configPath} lists none` : `${configPath} does not exist`}. `
|
|
656
|
+
+ `\`${BIND_COMMAND}\` binds one, and \`gh-account\` and \`gh-repo-access\` appear `
|
|
657
|
+
+ "once it does.";
|
|
658
|
+
auth.bound = false;
|
|
659
|
+
// The app renders `install` as a COPYABLE command wherever it shows a note,
|
|
660
|
+
// and it must not have to dig this out of the sentence above — that is the
|
|
661
|
+
// prose sniffing `bound` exists to end. No install BUTTON appears: that is
|
|
662
|
+
// driven by `CommandLineStep.isOffered`, which lists skill, pharos-convert,
|
|
663
|
+
// gh, libreoffice and pdftotext, and `gh-auth` is not among them. Signing in
|
|
664
|
+
// stays the user's own job (#890).
|
|
665
|
+
auth.install ??= BIND_COMMAND;
|
|
666
|
+
}
|
|
601
667
|
/** The `gh-auth` row, worded by which of the three states we are actually in. */
|
|
602
|
-
function authCheck(base, accounts, accountReports, authFailure) {
|
|
668
|
+
export function authCheck(base, accounts, accountReports, authFailure) {
|
|
603
669
|
if (authFailure !== undefined) {
|
|
604
670
|
return {
|
|
605
671
|
...base,
|
|
@@ -608,17 +674,61 @@ function authCheck(base, accounts, accountReports, authFailure) {
|
|
|
608
674
|
note: `\`gh auth status\` could not be run: ${authFailure}`,
|
|
609
675
|
};
|
|
610
676
|
}
|
|
677
|
+
// **LISTED IS NOT THE SAME AS WORKING, since #793.** `gh auth status --json
|
|
678
|
+
// hosts` lists an account whatever GitHub said about it, so reading
|
|
679
|
+
// `accounts.length > 0` as "signed in" reports a token GitHub has actively
|
|
680
|
+
// refused as healthy — and offers no way to fix it. Branch on `state`.
|
|
611
681
|
if (accounts.length > 0) {
|
|
612
|
-
const
|
|
613
|
-
|
|
614
|
-
|
|
682
|
+
const describe = (account) => `${account.login}${account.active ? " (active)" : ""}`;
|
|
683
|
+
const rejected = accounts.filter((account) => account.state === "rejected");
|
|
684
|
+
const unverified = accounts.filter((account) => account.state === "unverified");
|
|
685
|
+
// REJECTED IS THE ONE STATE THAT EARNS `gh auth login`, because it is the
|
|
686
|
+
// only one where GitHub itself has judged the credential. Named per account:
|
|
687
|
+
// re-authenticating the wrong login leaves the broken one broken.
|
|
688
|
+
if (rejected.length > 0) {
|
|
689
|
+
const reasons = rejected
|
|
690
|
+
.map((account) => account.stateDetail === undefined
|
|
691
|
+
? describe(account)
|
|
692
|
+
: `${describe(account)} — ${account.stateDetail}`)
|
|
693
|
+
.join("; ");
|
|
694
|
+
return {
|
|
695
|
+
...base,
|
|
696
|
+
ok: false,
|
|
697
|
+
install: `gh auth login --user ${rejected[0].login}`,
|
|
698
|
+
note: `GitHub REFUSED the credential for ${reasons}. This is the one case that is genuinely `
|
|
699
|
+
+ "a credential fault — gh asked and got a 401 or 403 back, rather than failing to ask. "
|
|
700
|
+
+ (accounts.length > rejected.length
|
|
701
|
+
? `Also held: ${accounts.filter((a) => a.state !== "rejected").map(describe).join(", ")}.`
|
|
702
|
+
: ""),
|
|
703
|
+
};
|
|
704
|
+
}
|
|
705
|
+
// UNVERIFIED IS NOT A FAULT AND MUST NOT OFFER `gh auth login`. gh holds the
|
|
706
|
+
// token and could not get an answer about it — an unreachable host, a 5xx, a
|
|
707
|
+
// gh too old to say. Sending somebody to re-authenticate over the network
|
|
708
|
+
// that is itself the problem is the original bug wearing a new hat.
|
|
709
|
+
if (unverified.length > 0) {
|
|
710
|
+
const reasons = unverified
|
|
711
|
+
.map((account) => account.stateDetail === undefined
|
|
712
|
+
? describe(account)
|
|
713
|
+
: `${describe(account)} — ${account.stateDetail}`)
|
|
714
|
+
.join("; ");
|
|
715
|
+
return {
|
|
716
|
+
...base,
|
|
717
|
+
ok: true,
|
|
718
|
+
install: null,
|
|
719
|
+
note: `gh holds ${reasons}, but could not check it with GitHub — unreachable, erroring, or a `
|
|
720
|
+
+ "gh too old to say which. That is NOT a credential fault and `gh auth login` is the "
|
|
721
|
+
+ "wrong answer to it; check the connection. The token still works for anything that "
|
|
722
|
+
+ "does not call out, because `gh auth token --user` reads the keyring offline.",
|
|
723
|
+
};
|
|
724
|
+
}
|
|
615
725
|
return {
|
|
616
726
|
...base,
|
|
617
727
|
ok: true,
|
|
618
728
|
install: null,
|
|
619
|
-
note: `Signed in: ${
|
|
620
|
-
+ "is reached as the account bound to it in repos.json,
|
|
621
|
-
+ "measurement the active one was the wrong one (plan §2).",
|
|
729
|
+
note: `Signed in: ${accounts.map(describe).join(", ")}. The active account is reported and `
|
|
730
|
+
+ "never acted on — a repository is reached as the account bound to it in repos.json, "
|
|
731
|
+
+ "because on this machine's own measurement the active one was the wrong one (plan §2).",
|
|
622
732
|
};
|
|
623
733
|
}
|
|
624
734
|
// Empty. Which cause it is, we may or may not be able to say — and saying the
|
|
@@ -654,10 +764,11 @@ function authCheck(base, accounts, accountReports, authFailure) {
|
|
|
654
764
|
...base,
|
|
655
765
|
ok: false,
|
|
656
766
|
install: "gh auth login",
|
|
657
|
-
note: "`gh auth status` listed no accounts
|
|
658
|
-
+ "
|
|
659
|
-
+ "
|
|
660
|
-
+ "
|
|
767
|
+
note: "`gh auth status` listed no accounts at all. Since #793 an unreachable github.com no "
|
|
768
|
+
+ "longer produces this — an account gh holds is listed whatever GitHub said, as "
|
|
769
|
+
+ "`unverified` — so the remaining causes are that nothing is signed in, or that gh is "
|
|
770
|
+
+ "reading a different config directory than the one holding your hosts.yml (a moved or "
|
|
771
|
+
+ "overridden GH_CONFIG_DIR / XDG_CONFIG_HOME).",
|
|
661
772
|
};
|
|
662
773
|
}
|
|
663
774
|
/**
|
|
@@ -669,8 +780,40 @@ function authCheck(base, accounts, accountReports, authFailure) {
|
|
|
669
780
|
* against what was configured; this records the account it asked as, the viewer
|
|
670
781
|
* that token turned out to be, and the node id — the identity that survives a
|
|
671
782
|
* rename — so a disagreement is a fact on the page rather than an inference.
|
|
783
|
+
*
|
|
784
|
+
* ## It is also the one row that makes real calls, so it can fail to ask (#886)
|
|
785
|
+
*
|
|
786
|
+
* This is the only GitHub row that needs the network — which means it is the
|
|
787
|
+
* only one that can be offline, and the first draft reported that as a fault.
|
|
788
|
+
* `gh-core` returned `unknown` for a dead socket, and `unknown` landed in the
|
|
789
|
+
* `else` below as {@link BIND_COMMAND}: **run the wizard on a plane and it told
|
|
790
|
+
* you to re-record a binding that was perfectly correct.**
|
|
791
|
+
*
|
|
792
|
+
* {@link authCheck} had already met this exactly one layer up and answered it —
|
|
793
|
+
* an `unverified` account is reported as not-a-fault and is deliberately NOT
|
|
794
|
+
* offered `gh auth login`, because sending somebody to re-authenticate over the
|
|
795
|
+
* network that is itself the problem is the original bug wearing a new hat.
|
|
796
|
+
* That reasoning is not about credentials specifically; it is about the
|
|
797
|
+
* difference between "we asked and the answer was no" and "we could not ask".
|
|
798
|
+
* `gh-core` now spells the second one `unreachable`, and this row treats it the
|
|
799
|
+
* same way `gh-auth` treats `unverified`:
|
|
800
|
+
*
|
|
801
|
+
* - the check is **green**, because nothing here is broken;
|
|
802
|
+
* - `install` is **null**, because no command would help — offering the wrong
|
|
803
|
+
* one is worse than offering none;
|
|
804
|
+
* - the note says *could not ask*, never *failed*.
|
|
805
|
+
*
|
|
806
|
+
* The per-repository row keeps `ok: false` with `problem: "unreachable"`, which
|
|
807
|
+
* is the honest pair: access was not proven, and it was not disproven either.
|
|
808
|
+
* A consumer rendering `repos` must branch on `problem` rather than paint every
|
|
809
|
+
* `ok: false` red — {@link render} below does, and the app's wizard step
|
|
810
|
+
* (`CommandLineStep.swift`, todo #888) has to as well.
|
|
811
|
+
*
|
|
812
|
+
* A **mixed** run still fails, and that is the point of separating them rather
|
|
813
|
+
* than counting: one repository unreachable and another genuinely unauthorized
|
|
814
|
+
* is a real fault with a real fix, and the fix is named for the fault.
|
|
672
815
|
*/
|
|
673
|
-
async function repoAccessCheck(client, bindings, configPath) {
|
|
816
|
+
export async function repoAccessCheck(client, bindings, configPath) {
|
|
674
817
|
const repos = await Promise.all(bindings.map(async (binding) => {
|
|
675
818
|
const report = await client.repos.verifyAccess(binding);
|
|
676
819
|
return {
|
|
@@ -685,6 +828,34 @@ async function repoAccessCheck(client, bindings, configPath) {
|
|
|
685
828
|
};
|
|
686
829
|
}));
|
|
687
830
|
const failed = repos.filter((report) => !report.ok);
|
|
831
|
+
// **Split before counting.** `failed` mixes two different things: repositories
|
|
832
|
+
// GitHub gave a verdict on, and repositories nobody could reach. Only the
|
|
833
|
+
// first kind is a fault, only the first kind earns an `install`, and the
|
|
834
|
+
// second kind is the whole of #886.
|
|
835
|
+
//
|
|
836
|
+
// A RATE LIMIT joins that second kind (#894). It arrives as a 403 carrying
|
|
837
|
+
// rate-limit headers, so before it was classified it read as a refused
|
|
838
|
+
// credential and earned the bind command — #886's mistake with the budget
|
|
839
|
+
// instead of the network. It is worded separately because the remedy is
|
|
840
|
+
// different: you wait, and telling somebody to check their connection because
|
|
841
|
+
// GitHub is rationing them would be wrong in a new way.
|
|
842
|
+
const unreachable = failed.filter((report) => report.problem === "unreachable");
|
|
843
|
+
const limited = failed.filter((report) => report.problem === "rate-limited");
|
|
844
|
+
const faults = failed.filter((report) => report.problem !== "unreachable" && report.problem !== "rate-limited");
|
|
845
|
+
/** Everything that was not judged, for the counts the note reports. */
|
|
846
|
+
const unasked = unreachable.length + limited.length;
|
|
847
|
+
const couldNotAsk = (unreachable.length === 0
|
|
848
|
+
? ""
|
|
849
|
+
: ` ${unreachable.length} of ${repos.length} could not be asked at all `
|
|
850
|
+
+ `(${unreachable.map((report) => report.repo).join(", ")}) — unreachable host or `
|
|
851
|
+
+ "GitHub erroring, which judges neither the binding nor the credential. Nothing to fix "
|
|
852
|
+
+ "here; check the connection and run this again.")
|
|
853
|
+
+ (limited.length === 0
|
|
854
|
+
? ""
|
|
855
|
+
: ` ${limited.length} of ${repos.length} hit the rate limit `
|
|
856
|
+
+ `(${limited.map((report) => report.repo).join(", ")}) — GitHub is rationing this `
|
|
857
|
+
+ "account, which judges neither the binding nor the credential. Nothing to fix here; "
|
|
858
|
+
+ "wait for the budget to reset and run this again.");
|
|
688
859
|
return {
|
|
689
860
|
id: "gh-repo-access",
|
|
690
861
|
name: "Bound repositories, read as their own account",
|
|
@@ -693,25 +864,35 @@ async function repoAccessCheck(client, bindings, configPath) {
|
|
|
693
864
|
+ "returned is the owner asked for.",
|
|
694
865
|
without: "A repository can 200 from the WRONG account and look fine, because two accounts can "
|
|
695
866
|
+ "each see one of that name. Silent, and wrong.",
|
|
696
|
-
|
|
867
|
+
// An unreachable host is not a failing check. See this function's note.
|
|
868
|
+
ok: faults.length === 0,
|
|
697
869
|
version: null,
|
|
698
870
|
path: configPath,
|
|
699
871
|
// The generic fix is the binding, EXCEPT where gh simply has no credential
|
|
700
872
|
// for the account — pointing that at `pharos setup` would send somebody to
|
|
701
|
-
// re-record a pair that is already right.
|
|
702
|
-
|
|
873
|
+
// re-record a pair that is already right. Same for a repository nobody
|
|
874
|
+
// could reach, which is why `faults` is what is asked here and not `failed`:
|
|
875
|
+
// there is no command for "the network is down", and BIND_COMMAND was being
|
|
876
|
+
// offered as one.
|
|
877
|
+
install: faults.length === 0
|
|
703
878
|
? null
|
|
704
|
-
:
|
|
879
|
+
: faults.some((report) => report.problem === "no-token")
|
|
705
880
|
? "gh auth login"
|
|
706
881
|
: BIND_COMMAND,
|
|
707
882
|
repos,
|
|
708
883
|
// Deliberately NOT a re-listing of `repos` — that array is the detail, and
|
|
709
884
|
// a note that restates it is two places to read and one place to disagree.
|
|
710
|
-
note: (
|
|
711
|
-
?
|
|
712
|
-
+
|
|
713
|
-
:
|
|
714
|
-
|
|
885
|
+
note: (faults.length > 0
|
|
886
|
+
? `${faults.length} of ${repos.length} failed: `
|
|
887
|
+
+ `${faults.map((report) => `${report.repo} (${report.problem ?? "unknown"})`).join(", ")}.`
|
|
888
|
+
: unasked === 0
|
|
889
|
+
? "Every bound repository answered as the account it is bound to, and the owner "
|
|
890
|
+
+ `returned matched the owner configured (${repos.length} checked).`
|
|
891
|
+
: unasked === repos.length
|
|
892
|
+
? "Nothing was proven either way — no repository could be asked."
|
|
893
|
+
: `${repos.length - unasked} of ${repos.length} answered as the account `
|
|
894
|
+
+ "they are bound to, and the owner returned matched the owner configured.")
|
|
895
|
+
+ couldNotAsk
|
|
715
896
|
+ " Each was reached as its configured account rather than whichever one `gh` has active;"
|
|
716
897
|
+ " per-repository detail, including the node id, is in `repos`.",
|
|
717
898
|
};
|
|
@@ -765,6 +946,23 @@ async function exists(path) {
|
|
|
765
946
|
return false;
|
|
766
947
|
}
|
|
767
948
|
}
|
|
949
|
+
/**
|
|
950
|
+
* The mark beside one repository — and there are **three** of them, not two.
|
|
951
|
+
*
|
|
952
|
+
* `ok: false` covers two different states (#886): GitHub gave a verdict and it
|
|
953
|
+
* was no, and nobody could be asked at all. Printing `✗` against an unreachable
|
|
954
|
+
* host is the same overclaim in ink that `install: BIND_COMMAND` was in JSON —
|
|
955
|
+
* a broken-looking line underneath a check that has just said it is fine. `?`
|
|
956
|
+
* is the state `gh` itself calls `unverified`.
|
|
957
|
+
*
|
|
958
|
+
* Its own function because it is the assertable half of that decision, and
|
|
959
|
+
* `render` is not reachable from a test without a machine in a known state.
|
|
960
|
+
*/
|
|
961
|
+
export function repoMark(repo) {
|
|
962
|
+
if (repo.ok)
|
|
963
|
+
return "✓";
|
|
964
|
+
return repo.problem === "unreachable" ? "?" : "✗";
|
|
965
|
+
}
|
|
768
966
|
/** The human rendering. Grouped by tier, because that is what "missing" means. */
|
|
769
967
|
function render(result) {
|
|
770
968
|
const lines = [];
|
|
@@ -793,8 +991,7 @@ function render(result) {
|
|
|
793
991
|
lines.push(` ${mark} ${account.account}${active} — ${account.detail}`);
|
|
794
992
|
}
|
|
795
993
|
for (const repo of check.repos ?? []) {
|
|
796
|
-
|
|
797
|
-
lines.push(` ${mark} ${repo.repo} as ${repo.account}`);
|
|
994
|
+
lines.push(` ${repoMark(repo)} ${repo.repo} as ${repo.account}`);
|
|
798
995
|
if (repo.viewer !== null)
|
|
799
996
|
lines.push(` token belongs to: ${repo.viewer}`);
|
|
800
997
|
if (repo.resolved !== null)
|