nexscope-cli 0.1.0__py3-none-any.whl

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 (74) hide show
  1. nexscope_cli/__init__.py +4 -0
  2. nexscope_cli/api-contract.json +37 -0
  3. nexscope_cli/capabilities/__init__.py +3 -0
  4. nexscope_cli/capabilities/catalog.py +73 -0
  5. nexscope_cli/capabilities/mock.py +53 -0
  6. nexscope_cli/capabilities/plan.py +142 -0
  7. nexscope_cli/catalog.json +69 -0
  8. nexscope_cli/compat/__init__.py +4 -0
  9. nexscope_cli/compat/legacy.py +143 -0
  10. nexscope_cli/core/__init__.py +3 -0
  11. nexscope_cli/core/auth.py +81 -0
  12. nexscope_cli/core/datasets.py +305 -0
  13. nexscope_cli/core/errors.py +11 -0
  14. nexscope_cli/core/evidence.py +134 -0
  15. nexscope_cli/core/execution.py +171 -0
  16. nexscope_cli/core/remote.py +22 -0
  17. nexscope_cli/core/transport.py +61 -0
  18. nexscope_cli/dependencies.lock +282 -0
  19. nexscope_cli/dependency-lock.json +371 -0
  20. nexscope_cli/doctor.py +136 -0
  21. nexscope_cli/main.py +313 -0
  22. nexscope_cli/reports/__init__.py +3 -0
  23. nexscope_cli/reports/compare.py +135 -0
  24. nexscope_cli/reports/formats.py +99 -0
  25. nexscope_cli/resources/__init__.py +3 -0
  26. nexscope_cli/resources/fields.json +33 -0
  27. nexscope_cli/resources/mock-products.json +9 -0
  28. nexscope_cli/resources/products-sample.csv +5 -0
  29. nexscope_cli/resources/products-sample.json +6 -0
  30. nexscope_cli/resources/products-template.csv +1 -0
  31. nexscope_cli/resources/products.schema.json +182 -0
  32. nexscope_cli/resources/report.html +15 -0
  33. nexscope_cli/runner.py +43 -0
  34. nexscope_cli/skills/amazon-product-detail/SKILL.md +170 -0
  35. nexscope_cli/skills/amazon-product-detail/references/api.md +239 -0
  36. nexscope_cli/skills/amazon-product-detail/requirements.txt +1 -0
  37. nexscope_cli/skills/amazon-product-detail/scripts/amazon_product_detail.py +26 -0
  38. nexscope_cli/skills/amazon-search/SKILL.md +197 -0
  39. nexscope_cli/skills/amazon-search/references/api.md +189 -0
  40. nexscope_cli/skills/amazon-search/requirements.txt +1 -0
  41. nexscope_cli/skills/amazon-search/scripts/amazon_search.py +26 -0
  42. nexscope_cli/workflows/__init__.py +3 -0
  43. nexscope_cli/workflows/compare.py +213 -0
  44. nexscope_cli-0.1.0.dist-info/METADATA +257 -0
  45. nexscope_cli-0.1.0.dist-info/RECORD +74 -0
  46. nexscope_cli-0.1.0.dist-info/WHEEL +5 -0
  47. nexscope_cli-0.1.0.dist-info/entry_points.txt +2 -0
  48. nexscope_cli-0.1.0.dist-info/licenses/ASSET-NOTICES.md +9 -0
  49. nexscope_cli-0.1.0.dist-info/licenses/LICENSE +202 -0
  50. nexscope_cli-0.1.0.dist-info/licenses/NOTICE +20 -0
  51. nexscope_cli-0.1.0.dist-info/licenses/THIRD-PARTY-NOTICES.md +27 -0
  52. nexscope_cli-0.1.0.dist-info/licenses/third-party-notices/backports-tarfile/LICENSE +17 -0
  53. nexscope_cli-0.1.0.dist-info/licenses/third-party-notices/certifi/LICENSE +20 -0
  54. nexscope_cli-0.1.0.dist-info/licenses/third-party-notices/cffi/LICENSE +23 -0
  55. nexscope_cli-0.1.0.dist-info/licenses/third-party-notices/charset-normalizer/LICENSE +21 -0
  56. nexscope_cli-0.1.0.dist-info/licenses/third-party-notices/cryptography/LICENSE +3 -0
  57. nexscope_cli-0.1.0.dist-info/licenses/third-party-notices/cryptography/LICENSE.APACHE +202 -0
  58. nexscope_cli-0.1.0.dist-info/licenses/third-party-notices/cryptography/LICENSE.BSD +27 -0
  59. nexscope_cli-0.1.0.dist-info/licenses/third-party-notices/idna/LICENSE.md +31 -0
  60. nexscope_cli-0.1.0.dist-info/licenses/third-party-notices/importlib-metadata/LICENSE +73 -0
  61. nexscope_cli-0.1.0.dist-info/licenses/third-party-notices/jaraco-classes/LICENSE +17 -0
  62. nexscope_cli-0.1.0.dist-info/licenses/third-party-notices/jaraco-context/LICENSE +18 -0
  63. nexscope_cli-0.1.0.dist-info/licenses/third-party-notices/jaraco-functools/LICENSE +18 -0
  64. nexscope_cli-0.1.0.dist-info/licenses/third-party-notices/jeepney/LICENSE +21 -0
  65. nexscope_cli-0.1.0.dist-info/licenses/third-party-notices/keyring/LICENSE +18 -0
  66. nexscope_cli-0.1.0.dist-info/licenses/third-party-notices/more-itertools/LICENSE +19 -0
  67. nexscope_cli-0.1.0.dist-info/licenses/third-party-notices/pycparser/LICENSE +27 -0
  68. nexscope_cli-0.1.0.dist-info/licenses/third-party-notices/pywin32-ctypes/LICENSE.txt +28 -0
  69. nexscope_cli-0.1.0.dist-info/licenses/third-party-notices/requests/LICENSE +175 -0
  70. nexscope_cli-0.1.0.dist-info/licenses/third-party-notices/requests/NOTICE +2 -0
  71. nexscope_cli-0.1.0.dist-info/licenses/third-party-notices/secretstorage/LICENSE +25 -0
  72. nexscope_cli-0.1.0.dist-info/licenses/third-party-notices/urllib3/LICENSE.txt +21 -0
  73. nexscope_cli-0.1.0.dist-info/licenses/third-party-notices/zipp/LICENSE +18 -0
  74. nexscope_cli-0.1.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,371 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "version": "0.1.0",
4
+ "distributionProfile": "data-only",
5
+ "directRequirements": [
6
+ "keyring>=25,<26",
7
+ "requests>=2.32,<3"
8
+ ],
9
+ "lockSha256": "8b09ca0b06cf603ebca2b58348dbb6fc49449cf667cb636cfb9a12564dec7f82",
10
+ "requirementsSha256": "5628394f6e1d62da120fcf66f80ada4e12109f45b680e5d61e9d1f69496c93fb",
11
+ "packages": [
12
+ {
13
+ "requirement": "backports-tarfile==1.2.0 ; python_full_version < '3.12'",
14
+ "sha256": [
15
+ "77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34",
16
+ "d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991"
17
+ ]
18
+ },
19
+ {
20
+ "requirement": "certifi==2026.7.22",
21
+ "sha256": [
22
+ "62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775",
23
+ "741e2c3b351ddf169a738da9f2c048608ff7f2c5cc02f1ebc6b118bb090d5d55"
24
+ ]
25
+ },
26
+ {
27
+ "requirement": "cffi==2.1.1 ; platform_python_implementation != 'PyPy' and sys_platform == 'linux'",
28
+ "sha256": [
29
+ "154852545011f779917b11c78db2358d095da62a9a172b78ad0a583ee5adc0d0",
30
+ "208f941bb9d18e768138677f0a6d2ce01f590df56043dda1df1535ac57c88517",
31
+ "210019b6c7cf07f081b4c54635c8cf744377001350e29cc0f81c4377b4797735",
32
+ "246fa40ce8645a614ff682e0b70f37134e460eaf93a775e0cbe3cca585a67a80",
33
+ "25792eac27877609e7bb06d42ff88278a6624fff2ba9bbb523c09616b117e80f",
34
+ "28907ab9bfb6aa13184cfc17c6b8e1023c5ab6fd7076d8c20a35e59fe04f8f29",
35
+ "31348097ff5bbe827ccc41795d4dd099d9f0625e7def00ee653c137a490c2a6c",
36
+ "3143d81e29e1e20a9ce10901ec369012947876596f75a222235965f2b7ae832e",
37
+ "3311ed60d36f83378794e1009ac6258bafbf81f7888b4caa7b35a521e3f95813",
38
+ "34e261f78cb6ceaaa36f42f2613f4380d94d9c759a9c73c769ee6e0247364632",
39
+ "363e05fa78e15116c3c32c210ee36884fd6b9afa6d440e47112c3bd511d64cb6",
40
+ "42a494cee34437f05546455144f2b5d9ac09b1face62bcfce597d2e521066688",
41
+ "456a61fa52d579ebf9df2e9552ead5129855dbaff6c1e5a9b1bc408809bdc062",
42
+ "471cee653ae88de62096552e6d24ccb4a5adb8c8c9f10b5054d0122c15bf2779",
43
+ "49cbc70e6542d4ccccb936558d1064a8012541e78f821f955cff24e357776c94",
44
+ "4a7c934f7360e8cd64fe9efadcbd10c7c6364f531e432b9a4bf5ccbc9e0e8b50",
45
+ "507a24c282e0f42f8ed737cf048572cbf580468da5555764a8331735e9c736b6",
46
+ "51b31d1c98274844cfd7838ce00bfc27c7423a4dc00fc0772fc3331c2cc90676",
47
+ "58acb8ab8e295e6c5ea12f888cbb13cf21511ef2a3303a23f4325c29d17fe5c1",
48
+ "5c58fe613dc5e5336357eff555824a314d8e43282600435c8d1cb6a7a2fedd13",
49
+ "5e7cecbaadb83884793e05828cee59b210b24583b9c7425d0ba6a754fe22eb4e",
50
+ "64faea20f4e2613363a1a9b9c7dd73058f3ecd00133a511e72ad7c511658f527",
51
+ "68e62fe11f30d5ca8289242866f0a5291402d8529ca2178ab8afc5c9694ae890",
52
+ "6a8dddef476fab96d066d578fc88526767b836ab5ab21754e1d5bf3879c31c7c",
53
+ "6e192623c49c94421616a5778fba35cf0d5a8d000650c1967ef4448ee5cdd990",
54
+ "7225e4514edb64eb6740324353e0da0711954fd8d7da4576755b1c6e09b697cd",
55
+ "770de9db11e84213beec501cfcaa013b019820ca881e03344dea5844f7876d94",
56
+ "7da0c5eff80f0197f3b3d1232ec5a682a9325f4ae9016a78f5f5ca35f9ced1f5",
57
+ "7dbb61fe3a7699468030f71bbe5f8a0e326a151daa91beb11a6fc1f980c55e1c",
58
+ "811bd1e21d32de12efca32393a0ab3f5133b54fce9bd44b8bd77ab07da14bf6a",
59
+ "937c0052c05a31ca1daf18de3158eed4dbfcb9cc107adbea227728d647be701e",
60
+ "a2d7755bef5a12ed488f4ef1f1b69ee9191d7396083b755a5d2295f6edb4768b",
61
+ "a4f00aa42f75d6e4595e8866e748cc1705adc0cddfeb2ca86d0d03993d63ba03",
62
+ "a6e721d4b0e45d5b65e87534470e67b18dcd092c83f68fba09f152b9cbc061af",
63
+ "a730a083190634c65cca36ba5f489531576ebd79bcd5c8e172130f6453127231",
64
+ "a931079504ecc49efed7744c476a5c343a92fabf66dec2db95edb1b2fdc770e2",
65
+ "aa9511c62d14da7aacc9b4bf51f3f697a621e83b2d6919008243c3aad168eea3",
66
+ "aeae0e330c9f6acd681f647d46cefd30c29f93e3392882e792e82080c9691399",
67
+ "b0431303acaea1089ad4b3e9ce4e6518193def1118d4073ca848635ee4ea2e96",
68
+ "b5bdfd1c873d4e093aabc0ca84c4ca6dbc4f752afb5c86f146d9742580c9da2e",
69
+ "c1453022f490d2459a11819d83ad1d586e9ff65a12ac3e705ffebd46d3685dcf",
70
+ "cc572dace3f60ef98d7b12ff411d20f5362feb31a0439eab0085bbfd349982d7",
71
+ "da0e573f9f97159390c89d9f1a9e41908b66d408cc5b58d08cf3847d844c531b",
72
+ "dd31f52ea1086513bb9df30f8fcee9b8918323ae067a3d5b78bc826a000712be",
73
+ "dddad92b554513a31f272570678ba307fb9f618f05e3d4a5eacafff9eae03e1d",
74
+ "df423d40ee8654634421812bc3b196da3f9bd7d32929da813f8394c4348a5358",
75
+ "df913725b79db7bcf03448f36b7bf8815363417d5b58deecf9305e3e30f0f21a",
76
+ "e0bcb7e0f677f543555d2adff3bf19c05f66cdb4796e5ff602442ab2fe3c4ef7",
77
+ "e2d65b31f36619cda3999b78b2aa9632e76b78448e7a56fc4240824200e7c4fc",
78
+ "f16c709686a78c727bbbf059f92b0bf41c6fc60deec706d2dc19f529175a6125",
79
+ "f24fb43132a4c6b4cb4eb029492919b2db645be6808d738f244fd146c03c32cb",
80
+ "f5cfbc5fe74540d335175b656c725d74d90e3730c626d92575eea35029d9afaa",
81
+ "fcd22650c908d7b7da162bbfaab594a1227a15d1643a98c68b122ac642fa2264"
82
+ ]
83
+ },
84
+ {
85
+ "requirement": "charset-normalizer==3.5.1",
86
+ "sha256": [
87
+ "01e93745f7f219b703b60ba7afead36cfc4242782be5af484673fc500df12da5",
88
+ "04368edf83514385ffc3e1cfd4546e595f4f1272dd23ba437a93a9cc3741d47b",
89
+ "0722590aabf9dc6a6c0343d523c05458fa2b5047dbe6302fd526bb570600753f",
90
+ "09a7bba9f739468c8e78c36a75c33768e53cb1959fc638f510454c14683f00d5",
91
+ "0b2b1b3fa5670c127b246df1d0c059defd41f689a868a3b9d79df9b1cac42d22",
92
+ "0c6dfb5ca6723eeed15aa8e564a014d69fcb8812f94eef11fe3631e0508199f5",
93
+ "0d929fc574b4d6fd9e7c0f5c2ede8716a41911923aa7fa5fce38e0818aa4a1ac",
94
+ "15f024313246a4ed976c60f440bb8d257815513a681d212ff74fd46f7d715a90",
95
+ "195ce897c6153c0700078142cf8efe3e6454ca4cf4357499e4078dfd83396626",
96
+ "19a3dd5aa73cef1c99687c4fc57db016a9c17104ae1185da88ba566a5d3bebe4",
97
+ "1d1c7a53a6c2103925cdd6d7229f8c567379f211c869793df679f2e9f738c369",
98
+ "1f5883d77fd409a261abb5dc8ccbe335720d798b1de4abb3b1d47ccbbc76b53b",
99
+ "21b82d8082f6f5e7f456ef0bd16323d08de1266efbfeb476e64b2a91d1471a4e",
100
+ "252d099029bcbea642f2a06c4ed5046bdf8b5a8150b64afa5e027e88b106e5ee",
101
+ "256dd4d85d9e4dc595e2bc983c980e73f62ddeb3165c58b4c3dfe78c5c8548c1",
102
+ "26422d45fd13551cf564c58932f7d72b4f58b93b0fcf18c35ba6be12b46bb102",
103
+ "2679de311c7946dde5d3b6f44941844133ff5c7cb86099c0061ab1e8901c20a8",
104
+ "2bced4061f000f7187254a02ad3433ae17eaf991747ceea2f478422590a5bba9",
105
+ "2f06b7eae9dbe77fe1d644ca244dad508de8d302870a43f3c559b521270938a0",
106
+ "2f293479cce755c75f1697e87c409b7ae4c555c7dfecb6e988ad13abba943031",
107
+ "329fc3ccb63ad22d867d84c2adea759a64079a37ba4a343433b02c7a2816871e",
108
+ "343fb4f2821043bd87095f7b08a1a181febc8e36ac64212143bbfd0a0e1bc235",
109
+ "3588e376b3ea2eea84976f67273d679f229e24c66dce7b82ae45aef04ff6e072",
110
+ "35aea775dc2bd5f54cd84a1cd2696cc3207c479cb9cf0bd346f0d343e4300ddb",
111
+ "35fe081843b35aad20ffeccec3eeffbe637b15d14f3fb22cc1b59cd8ec17e93c",
112
+ "36047af20e17097c3bb9476c2b7655f2f7aa51322c0ba58c07695bedf755a950",
113
+ "3617ac3cfd8b9888f145ad89dd6e692285834b0201c6074a5eeaad3fd4d668c2",
114
+ "394fea06235c8543390050ed5f529187074b029fb027213f6c46ac11ab5d950e",
115
+ "3d27167433c0d5f18dc850f07d0b3816221984fecdc405d6c157a6f0b8f8e9e6",
116
+ "41876ee62a3dddf48ff1121ad8f0798032aa03f2fd35f21f34a4cab14f18d8d2",
117
+ "4582c27e8c889d64811987b5967fbd3ae0c823fe1fd933b543d55ac20bb475fa",
118
+ "485a0d363cafefcd2538a73c7c838daa2035f09b2c9f9b5e3133f80c6aeb84c2",
119
+ "496846868fea80e479324862fa877f02411f2fd0f83b79ccee2607aa68b2a032",
120
+ "4abdc5f9ad448c1ecbfae2974b820535d6bc6e7eef63babbab3d81cf46968c71",
121
+ "4b599739b93b2cbeded49645ae3c8d1405c29ddfbceac1545c87a3f9580a9e96",
122
+ "4bea7f8ebe90bbd7f0e4a2de42ca6924ba23e3e76418c408ff82f1d46fabd687",
123
+ "4c4fb141a727957c93edfe5c32a26ceb6b5f6461d67146e2d39f51e16170bea8",
124
+ "4c9548dc78002099910abaebc0a72ac58b7d30931869e0351c09b507dff4ece3",
125
+ "4d26f14f041e83dd8edfd61f4cd4fa7285d31798b5bf1f28e70c367ba6c41d61",
126
+ "4f298bdadb8f0b9e5672877f647d1be9373ef5320c9e2f049795e26cad28b6a9",
127
+ "52ec005752a56ae79547a05c0139ca2501a0c866390b6115008456b9f0e7cde1",
128
+ "58d3e12c88e0950bca850ae1f7c256055c097639c2edb9eb123af9807d8b15e4",
129
+ "58d4aa13a59c969dbfdf9e6a9560e242cbfd9e8a8f50c2747714df1a423adf65",
130
+ "59171c6e45bf07d0d5cab3b0bf81d945035530f6873398b3b531c31184d46663",
131
+ "5b6d1386bf0096d26d3a863dc0a487a5b4eb9aa93cf5ba69683d29dde6b9d60f",
132
+ "5c0ea61a470e070686aa30892fed79e297d2c8d0ab46b8bcdf027d38c51da591",
133
+ "5c84bec0ab5ae0c64bfe73a7d2adcb5ce73b467523fc27fd6a28ab2aa6cbe35a",
134
+ "5d8531a6569d025f68e2321e7638fb7978f23db58e5f69f56913837aae03816e",
135
+ "5fc45d653ea8c9a20479167e11d4a0f8cb2fa3470737ab6f9c827532313187b7",
136
+ "6117b84ea48435e5356dc737f5121485c30920ba43375fa7b434fd753df0eac3",
137
+ "6199d5606e2bbf2b096cf64d03f8b6790c91081d5ac866b8e7bb6422738cc60c",
138
+ "62b55f6722735a6c472f88361cde6640608773d9443cebdbb51abf436a1fcdd3",
139
+ "687c9ca3035544b113bea2055e180af96fb63c0c476e22a9180f51925186e7b7",
140
+ "6b7430cf5728e68f6c462254009a6ef4086e1bea43cf2f57aa9c55fb4f50ff96",
141
+ "6ba32c4d2abf1d2fe7cf27d280f4cca5664233b0f885549c7761719eb977f486",
142
+ "6c9cdde8becb25a7fde49924511aa2644d6f8081cc8df8e9452724303348d8e3",
143
+ "6df0ec430f9a831772c23ca5a224cba36517a58a84bb32c32bb59a9fa67c47f6",
144
+ "6e2912d4babbc65196ac13c2f53468dc57fb8b9c25ef913e8c59ddf7c6dc0e1b",
145
+ "6e5e4d73d588ca5ed09df1b7dcd1b203d1df3c542e3f50d126c947d432b10731",
146
+ "70055ff39b97c99e7ae40ea3e393fb62aa2e44dbd9b29f8d14f42fb0025c3959",
147
+ "706bfd38730a5ac7a365793269a00f4e988178cec121391f4248d84ad8c972e9",
148
+ "7235dc28fc6dd9d832ac7c7bce95367dedb85929f17368a0c2bee1e080b9acbf",
149
+ "774d157f112367ff4abd29019f38f023c24e00e56edc7829c20e358a5a913ad8",
150
+ "77efcff2b23071c349402ac1066667a3d011f62398d81408c9b88ad991747c9e",
151
+ "7ac76cf9afd34929d76eb7fcb63be476a4853d8a96f0dcf2d0db68a0cbdf9885",
152
+ "7c0c10730342b0c9b35dd1d619beb8214e520bd96a1f870f452680b238aab3e0",
153
+ "823f82903d189af463d7df250ef1f7f696f3cee08cc8d91deb565e8d425f6506",
154
+ "838648accb3a7fd9803fd45c87bce8509648eb0c11bc34e216141300977244f2",
155
+ "854066be00447fa8de2ccbbe893e2ffc4b123ef16d897af794c1e18bd4a714b0",
156
+ "85d5855daafc240cc045c026d7a15fd198a09b0fc8ff6f5ecbb5297b509cb11e",
157
+ "87e4f41d375c0b9be2fb5251aee4b8a689169e134535aed81bf085c3b647451e",
158
+ "88ca277405c2d3b71c4e1c2ee0e7966e807bcba86a69d11e19ba199d18ae4491",
159
+ "88e85ab89cb822c1e635f51d6d32e488f94e002e70e2f492bdb8b945543f345a",
160
+ "8ac8c94b6539074e0f40899301273ac8402b9b3e01c7b7ba269ff30340aaaf20",
161
+ "8fe532b3c966d1fb794e0698e4589d0444017ae77fc0b31edea13c0e35bcc449",
162
+ "9085f87b0e38a2b92b8923059b4e8789fe40d9279712d15dcc670048d77079af",
163
+ "90b7481fb62fbe172c558bc6fd1c4c98d82004a54a7551f20e11ac9bf0b8708c",
164
+ "92caef967d287a407085d61176fce4012b1dd62daed4eb6d5ceb26d3d2538712",
165
+ "9362dd90aa7dab48c0054a21187791ccf05473f7dba5d92b8033ae62164675e7",
166
+ "94d78ecec2605a8d0398b0f365d5f12a63248438516f5dac536a5eff7337df4a",
167
+ "96fef3e886d6a9874b14f27fc193fbdc69d5d8035783d86aa4e1cea594e695f9",
168
+ "977cdbd483a9cff38179bea4fd754289a6f2195c7abd414aba85410b3e66cc5e",
169
+ "978eab16f55b4ab2c2a745be9a0a840bf8f09a7f227d9c76eb30214d078865a5",
170
+ "9ac4444d8d4fd4c4bd08bf451ed3167aa9e7ec6cdb41b648794f1d1103652e36",
171
+ "9b5db6052055d34d41230fb78d7c439c23dc536a9896f6cb039e8dd92cfc1263",
172
+ "9d9a0dc7cbe9bec24c3f767c9122c41fe5a1bc43f47cd099d00d393e09769de4",
173
+ "9dbdd9205662134957cf0c324f639bdc5031c0ca056e2369e238db75187c0f11",
174
+ "9eea3ab2597a5e65fe65296e2d6a84570845a6b55532d90333d740d48bbc850a",
175
+ "a2028475ba855475b8b4d3cfeb4994269c967aea8b9892dfba907f4263a863a3",
176
+ "a3a370082ce34d0612f421e15fe011c53bb1feff21a26d06ad4fb244dab5a375",
177
+ "a5cbd90ecf0fc62e64726917ad083b73001f0563657a87ec3c0b504e277dc90d",
178
+ "a6dac12ff6b846103483683f60c5f8fee205121adc58ffd87e90a90a3af69e99",
179
+ "aa1099b956fb795e686d073568f6dc002a0bb89765ea6d5b055dd7d9bf1b116c",
180
+ "aa2bb0b37202dca27175591f761108b5d34096ade1191ffe4808bdf6b1571488",
181
+ "aae2ee51122d3ae968a3837d97dc24a0aeebb0dea23694422cd172bd30017cd6",
182
+ "ab743e9bc90c1f73552ec33e10e3331315acd2c397b36065b591b0181de533cc",
183
+ "ac00177c4831ffa650f8609e4bdddd5fe09c03b1c0c47acece7e6ea20421598b",
184
+ "ac13b004224fb341e1e25a1ed5e19d32f57cdb2a403e01f003b46f051a550f6f",
185
+ "acaf604462bf330b0d07e7a07c1d6e4adac79e5fb13e9c5140590542cafacc00",
186
+ "ae31a1a1db2ee6cc2942fccaf695c934bc7f3db9f2133a3fef1f367cf1a4ab10",
187
+ "ae4a097991662cd4fff0ddc74e0fe7874f82e00042fa0ea00855645ed0c79598",
188
+ "aea996a6aba25260827c9ea511d1addfde2da9eb686ac961838509086188b7e6",
189
+ "b39b69b347e5e47a3b5b8cfc005c68c1ba347474e3960236c4944a8ecd174962",
190
+ "b54e7e13267d49ffbfe68e25b3cbd774dab38fa37238f71265e91b36146eb21c",
191
+ "b9af956078716df40d985fb0dfeb2c2120c5ca92ba4ff4b388acfd01cdc14d08",
192
+ "ba501e667c17d8411f98e67a022d9604ef179aff0e459b7e292c796837c13573",
193
+ "baf3775a2635e5a11fbd5e4e64ee69c7e86875d224a5c72aca4c141064589a90",
194
+ "bb57753e36e4855b8ca375069482250a6246372331a3e4f3407eaebb007443f5",
195
+ "bd6c173f04743d483881bffa1478d5a4624475b8cd1d2194956a75548e191c18",
196
+ "c010f5581d9c612804cc59fcf7b524b707fbcb72828551237ab545bb5c7034af",
197
+ "c428c6c31eb5f4277d7f8eccaf767fbd548ddd5ce3c8b4f4cbbfab3d96b5904c",
198
+ "c658c50ac0c98cd755a2dd50b7977d3bca7df401dcc47fbdfa87db53ef7d4e8b",
199
+ "c71fb0d56c920c269cd3e2e3fe7c610e3f1fdb21a6ce60efa6430ff63676cea6",
200
+ "c7b742bf31c88566b4bb6335a7f393bb322e580b6bb98df7bd0c25e6e3519ce8",
201
+ "cc0329df4caaceb950d2f580b5ac716a377f7059624a0bafaeaf8a218c6ed774",
202
+ "cc5d36d96478aa9c60654bd932525bf32964c62a7281eafdf16d85003a8d6004",
203
+ "ced3fdd71aaa83ce593746c2edb42b7a59cb4c19c8b5c407781c72e493aae55a",
204
+ "cee5dd7c6fb5dd52a0fe2a740f9bc6e3593f5f8b1788bde49de02086f30182b2",
205
+ "cfa1c0cc3a8f9f53f1243a5a99ac36fd003880199383b37672e86ddda9cb07e2",
206
+ "d59b75732e9b6f27388e10c14b0259cc5f2e48c78627d185e6a177b58ad3cffe",
207
+ "d63600d620ad0064c3a748b950ac5ea38a80190e5498532efefa4b7b3f1da1f3",
208
+ "dd732602a7009217f658d5863d12d79d373a4de0eebc111094bcdd3bb8e0a6cc",
209
+ "e199fb99720074809a7720f1c0b4d919eea8b87e88713e0f8f602f7bef543d9d",
210
+ "e4b018dc5a0eee4676e38fe84a47a427816c590b93b55d9025274ec4d6ffc2dc",
211
+ "e6621fb2a4988d6e53eedc455e5903e2679f3967b8acb3d639f1b63c14a2e893",
212
+ "e71c909f353863b2b89c83de2ebed71ea6d0df8a6ef65a128193c5e650766bef",
213
+ "e90251c0c7bdd54a100a0dce3c07b7e637278c93af29dbf78ebb89a58c4bac7d",
214
+ "eda059b6bc8bc0812d626fd91a7ce01bf583df0a61296eff390fd94141a34e30",
215
+ "f03ac127268b43ef4fe9e6ab6794a6794b49485a0cc0c1db79876d2f33f75bc7",
216
+ "f298e218441525d3794428b4c8b8fb8662c6d3ea79925d4807ee6b9a96a3bca5",
217
+ "f6f7deae3feb4edfa2efaf7c574fe88cbf055038a6abdb40188e4fff66d5699f",
218
+ "f9b1e28d0e8dbfa858abdba91d6b547beaf2df1a59bec6da6faae7b96a4991a9",
219
+ "f9f8405c2c758532c74fed975dbee57be1f31a6e865c031870c79a6ed3212ada",
220
+ "fa48b1b63d639f9483e0633e092f5851e2348c352f1f9bb6c8182f87884ef876",
221
+ "fb78f6e7fcd8ad785d28cd577168bc1aaee827b25bb8755638f694794ea98f0a",
222
+ "fbc597639158fd7c14d55e808718848319540f51b0e6746e3eefa59723a4a348",
223
+ "fce8cbd4997efeb450bd298b54f755dcdff18d496f7a5ddbb4867c6d7c88fdc3",
224
+ "fd0350afdc3aabd5576f60ea109228bd5538139713c7b094c5cd27c73a98bc6f",
225
+ "fd0a274c0e5f9a21565cd9d3dd749b61f96b7aa1e20a93aa1ba4029518f2e5c0",
226
+ "fdb8a068947befafba9952162645dc2fecaeb400e64584829ed5e9b2fbe21a7f"
227
+ ]
228
+ },
229
+ {
230
+ "requirement": "cryptography==50.0.1 ; sys_platform == 'linux'",
231
+ "sha256": [
232
+ "01f41478cf33fc605a6a089cd56d28b45c6c0b45a1928b61797f2621a04bac71",
233
+ "05ba322c4da95b262a212c345af888ef2c37c88c0509756ea00a0e6d68850f23",
234
+ "16c5ecd954b3330ebfb6605eca4fd952da8bef376551d5cc264534e3770a9ee6",
235
+ "2a93d05e34d5f67fba6f891fe85d929999baa7195e853923ea6d7576c9e68c5e",
236
+ "2b34d76a652ea2b6faf777c35df230c5637842cd904e04f16230c3f9f03e4361",
237
+ "2ebbfb0f1fed745e91796e3e1080a1440423fdae8ece1b995a1d80883a409054",
238
+ "330fbb252391c596f1ae42c5754449dc924e6ad012dca8efe0d703f9f2d12ec6",
239
+ "359e62deae718bce96170e223fdcb6357e4fbd3bb7a3a75f4430763532560e49",
240
+ "407fe2b6db00939c05c0e945e9914238f2f0a430974839429dafc82b1ee6bee5",
241
+ "42be3bb70596b3abe4ac097b75be223e8b3ab614a0e5de068e3dcc54d71d6149",
242
+ "4c4188f7c0cf655be5c06342b817ed0f9595b69ffa2b12026e5353eed29dea88",
243
+ "51593d180cf6d179bde5c5d065bed81386b1f381656ae7d042b7ffc87a9895ad",
244
+ "51afcfceb15597cf2635068e4ac9a56b2abde622edde17f37d85fd7b5306497a",
245
+ "53e279950892dc102c6b4e52af03ae5ea92fac572a1ddab78ca73a997f62b69f",
246
+ "5dd9bda1c12b4162f6ff568eeb5e0ff956c28d14406e875cfe8a63a2d414ff20",
247
+ "5fe002589592ed749ce77fe0695fcbd3500dd61d7d6db5858a7544c612fa8e45",
248
+ "5fe939deeb161024a6be98229c953b6591fef1f41214497a78fe793a244c017f",
249
+ "76de83fbd91ac49c0feaaa983d0748fd7a53176afac5fb3bf7478d244f0eb527",
250
+ "79bf008d1f9af6071c797ad133e39915dfee7614f18f18f4db9072eb715064a3",
251
+ "804728ce710890870f3aaa344b2e161172d258d768ac139d02cfd9092d0d94e6",
252
+ "8921d58f426793c5f1b47f0b59575780de9a095214958d0eb37d909593db8367",
253
+ "8df2de9102026855887e4587084f6eabd80ed0f345b8ad8a7ac27ab9bf4723e0",
254
+ "9dde0a357190eb3b1da1bb9ab750e9c85cba82ca5977aa0836cbb94e92611239",
255
+ "9ebcdd5519be9b652a46f507817a74591774fc3d6923ac364e4dfa64e36b291b",
256
+ "a0b1a59e3a089064a0ec309e9428c8e3ae4e161419d20ac33600767e83fc658a",
257
+ "a255449073358275b64b67d3f595f268bbef70e72b6edb65e0c70c735bf739c9",
258
+ "a8f40ea47330e71b594a7e246898f93177c259490c63183dbaf9e571d71ed9a5",
259
+ "ac02b07824d4d1001bd4367599f839c19cb171924c796e52c23508ac14c2c0cc",
260
+ "be224a65493ec5b74a158ff22a5522ce4a5ca1e543c647a3a4730d4a09e5f959",
261
+ "cbf74a81765ee67413503ca6e26dcc4f6f5a519822436cc0a1b97aab6c1b8a17",
262
+ "d63ae8f6481fec907ac0f588eee8a90aefde112c633131fe540e5711ddbb5a4e",
263
+ "e22dfed744bd4002e909464cb23d2f0b05c6f3113a79ef2e9864a53db737c733",
264
+ "e2ca8fd1b6b4b82a1c4cb02841d0837e3c12336c2e24b520ab8ab3b969733d8f",
265
+ "e74591e283fe6eb956416c929eb58262a719fe0311fd9054c62c3350ed8760d8",
266
+ "fb4b9672d389c738b175c4166e78310f8a70358886aacd9173ee03a85ffdc671",
267
+ "fc3ed7ebd2a8c96f5b166de0ab9b624996bef3b07bbeb19364dfb78222c22c80",
268
+ "fd3718b960d0b5dd213cdf03f3bcb7000e69dda0de8b956061947ff6bcff5558",
269
+ "ff838d62ec1bfce4f9ba7fa16f4a7b554cd8d0c299e6be37502161a660c84eef"
270
+ ]
271
+ },
272
+ {
273
+ "requirement": "idna==3.20",
274
+ "sha256": [
275
+ "a7db850025b95ded1eae8a46181a1a6c56c92c96f0e2b005d9ff8dc0210cab44",
276
+ "ab7ae7122974553370f0bdb919e1a960b2cd1bc1ef0276416d896db81c14582c"
277
+ ]
278
+ },
279
+ {
280
+ "requirement": "importlib-metadata==9.0.1 ; python_full_version < '3.12'",
281
+ "sha256": [
282
+ "ab830580bc0ef3db61ce8fae716389e5462b67e033018bab6d8f80ef17172f99",
283
+ "bba5600596a7e21f3eef53281cf28d6a5195634d2f2b78ff9501a3272c6eaab0"
284
+ ]
285
+ },
286
+ {
287
+ "requirement": "jaraco-classes==3.4.0",
288
+ "sha256": [
289
+ "47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd",
290
+ "f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790"
291
+ ]
292
+ },
293
+ {
294
+ "requirement": "jaraco-context==6.1.2",
295
+ "sha256": [
296
+ "bf8150b79a2d5d91ae48629d8b427a8f7ba0e1097dd6202a9059f29a36379535",
297
+ "f1a6c9d391e661cc5b8d39861ff077a7dc24dc23833ccee564b234b81c82dfe3"
298
+ ]
299
+ },
300
+ {
301
+ "requirement": "jaraco-functools==4.6.0",
302
+ "sha256": [
303
+ "880c577ec9720b3a052d5bc611fb9f2269b3d87902ef42440df443b88e443280",
304
+ "99e3dc0060c5cbe8fcd1cdb36258e2a65ca40f1566b2033b12abb1bb44dd3c30"
305
+ ]
306
+ },
307
+ {
308
+ "requirement": "jeepney==0.9.0 ; sys_platform == 'linux'",
309
+ "sha256": [
310
+ "97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683",
311
+ "cf0e9e845622b81e4a28df94c40345400256ec608d0e55bb8a3feaa9163f5732"
312
+ ]
313
+ },
314
+ {
315
+ "requirement": "keyring==25.7.0",
316
+ "sha256": [
317
+ "be4a0b195f149690c166e850609a477c532ddbfbaed96a404d4e43f8d5e2689f",
318
+ "fe01bd85eb3f8fb3dd0405defdeac9a5b4f6f0439edbb3149577f244a2e8245b"
319
+ ]
320
+ },
321
+ {
322
+ "requirement": "more-itertools==11.1.0",
323
+ "sha256": [
324
+ "48e8f4d9e7e5878571ecf6f2b4e57634f93cd474cc8cfbd2376f2d11b396e30d",
325
+ "4b65538ae22f6fed0ce4874efd317463a7489796a0939fa66824dd542125a192"
326
+ ]
327
+ },
328
+ {
329
+ "requirement": "pycparser==3.0 ; implementation_name != 'PyPy' and platform_python_implementation != 'PyPy' and sys_platform == 'linux'",
330
+ "sha256": [
331
+ "600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29",
332
+ "b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992"
333
+ ]
334
+ },
335
+ {
336
+ "requirement": "pywin32-ctypes==0.2.3 ; sys_platform == 'win32'",
337
+ "sha256": [
338
+ "8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8",
339
+ "d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755"
340
+ ]
341
+ },
342
+ {
343
+ "requirement": "requests==2.34.2",
344
+ "sha256": [
345
+ "2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0",
346
+ "f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed"
347
+ ]
348
+ },
349
+ {
350
+ "requirement": "secretstorage==3.5.0 ; sys_platform == 'linux'",
351
+ "sha256": [
352
+ "0ce65888c0725fcb2c5bc0fdb8e5438eece02c523557ea40ce0703c266248137",
353
+ "f04b8e4689cbce351744d5537bf6b1329c6fc68f91fa666f60a380edddcd11be"
354
+ ]
355
+ },
356
+ {
357
+ "requirement": "urllib3==2.8.0",
358
+ "sha256": [
359
+ "0cf3cae568d36aa9576b28dfb35f11328f1cb974ca7647d9475ebb86c75ac6e3",
360
+ "63bf2ead4c879426ebf22ef2a781eeb4aa3b4ae798a0435506f8687fd5bb9b63"
361
+ ]
362
+ },
363
+ {
364
+ "requirement": "zipp==4.1.0 ; python_full_version < '3.12'",
365
+ "sha256": [
366
+ "25ad4e16390cd314347dd8f1de67a2ac538ae658ed4ab9db16029c07c188e97f",
367
+ "4cb57381f544315db7688e976e922a2b18cdb513d21cc194eb42232ba2a3e602"
368
+ ]
369
+ }
370
+ ]
371
+ }
nexscope_cli/doctor.py ADDED
@@ -0,0 +1,136 @@
1
+ # Copyright 2026 Nexscope
2
+ # SPDX-License-Identifier: Apache-2.0
3
+ """Local diagnostics. Never connect, initialize a keyring or read stored credentials."""
4
+ import hashlib
5
+ from importlib import metadata
6
+ import json
7
+ import os
8
+ from pathlib import Path
9
+ import re
10
+ import shutil
11
+ import sys
12
+ import tempfile
13
+
14
+ from . import __version__
15
+ from .core.auth import DEFAULT_ORIGIN, origin
16
+ from .core.errors import Failure
17
+
18
+ PROFILES = ('offline', 'independent', 'plugin')
19
+ DEPENDENCIES = {'keyring': (25, 26), 'requests': (2, 3), 'jmespath': (1, 2),
20
+ 'qrcode': (8, 9), 'oss2': (2, 3)}
21
+ MINIMUMS = {'keyring': (25,), 'requests': (2, 32), 'jmespath': (1,),
22
+ 'qrcode': (8,), 'oss2': (2, 19)}
23
+
24
+
25
+ def dependency_names():
26
+ profile = json.loads(Path(__file__).with_name('catalog.json').read_text(encoding='utf-8')).get('distributionProfile', 'full')
27
+ if profile not in ('data-only', 'full'):
28
+ raise ValueError('Unknown distribution profile.')
29
+ return ('keyring', 'requests') if profile == 'data-only' else tuple(DEPENDENCIES)
30
+
31
+
32
+ def resources(root):
33
+ """Check installed bytes, including the resources needed for free reports."""
34
+ catalog = json.loads((root / 'catalog.json').read_text(encoding='utf-8'))
35
+ count = 0
36
+ for name, entry in catalog['skills'].items():
37
+ for relative, digest in entry['files'].items():
38
+ file = (root / 'skills' / name / relative).resolve()
39
+ if not file.is_relative_to((root / 'skills').resolve()):
40
+ raise ValueError('Invalid resource path')
41
+ if hashlib.sha256(file.read_bytes()).hexdigest() != digest:
42
+ raise ValueError('Resource digest mismatch')
43
+ count += 1
44
+ for name in ('fields.json', 'products.schema.json', 'products-template.csv',
45
+ 'products-sample.csv', 'products-sample.json', 'report.html', 'mock-products.json'):
46
+ data = (root / 'resources' / name).read_bytes()
47
+ if not data:
48
+ raise ValueError('Empty report resource')
49
+ if name.endswith('.json'):
50
+ json.loads(data)
51
+ return count
52
+
53
+
54
+ def diagnose(profile='offline', output_dir=None, api_base=None):
55
+ if profile not in PROFILES:
56
+ raise ValueError('Unknown diagnostic profile.')
57
+ checks = []
58
+
59
+ def check(name, status, detail, action=None):
60
+ checks.append({'name': name, 'status': status, 'detail': detail, 'action': action})
61
+
62
+ check('python', 'PASS' if sys.version_info >= (3, 11) else 'FAIL', '.'.join(map(str, sys.version_info[:3])),
63
+ 'Use Python 3.11 or newer.' if sys.version_info < (3, 11) else None)
64
+ try:
65
+ installed = metadata.version('nexscope-cli')
66
+ check('package-version', 'PASS' if installed == __version__ else 'FAIL',
67
+ 'Installed metadata matches loaded code.' if installed == __version__ else 'Installed metadata differs from loaded code.',
68
+ None if installed == __version__ else 'Reinstall the paired wheel in this Python environment.')
69
+ except metadata.PackageNotFoundError:
70
+ check('package-version', 'WARN', 'No installed distribution metadata.', 'Install the paired wheel before installation acceptance.')
71
+ try:
72
+ count = resources(Path(__file__).parent)
73
+ check('resources', 'PASS', {'hashedSkillFiles': count, 'reportResources': 7})
74
+ except Exception:
75
+ check('resources', 'FAIL', 'Required resources are missing, invalid or have a digest mismatch.', 'Reinstall the verified wheel; do not disable integrity checks.')
76
+ if profile == 'plugin':
77
+ for name in dependency_names():
78
+ _, upper = DEPENDENCIES[name]
79
+ try:
80
+ raw = metadata.version(name)
81
+ # No dependency import: importing keyring can initialize user configuration.
82
+ match = re.fullmatch(r'\d+(?:\.\d+)*', raw)
83
+ version = tuple(map(int, raw.split('.'))) if match else ()
84
+ valid = bool(version) and MINIMUMS[name] <= version < (upper,)
85
+ check('dependency:' + name, 'PASS' if valid else 'FAIL', 'Compatible version installed.' if valid else 'Version outside the supported stable range.',
86
+ None if valid else 'Install the hash-pinned dependency profile paired with this wheel.')
87
+ except metadata.PackageNotFoundError:
88
+ check('dependency:' + name, 'FAIL', 'Dependency is not installed.', 'Install the hash-pinned dependency profile paired with this wheel.')
89
+ check('uv', 'PASS' if shutil.which('uv') else 'WARN',
90
+ 'Installer found on PATH.' if shutil.which('uv') else 'Optional installer not found on PATH.',
91
+ 'Use the documented installer before plugin setup; no installer is run by doctor.')
92
+ check('credential-store', 'NOT_CHECKED', 'No keyring initialization, access or credential validation.',
93
+ 'Validate the OS credential store separately in an authorized connection test.')
94
+ try:
95
+ origin(api_base if api_base is not None else DEFAULT_ORIGIN)
96
+ check('api-origin', 'PASS', 'Origin syntax accepted; reachability not tested.')
97
+ except Failure:
98
+ check('api-origin', 'FAIL', 'Invalid API origin.', 'Use an HTTPS origin without credentials, path, query or fragment.')
99
+ elif profile == 'independent':
100
+ key = os.environ.get('NEXSCOPE_API_KEY', '').strip()
101
+ base = os.environ.get('NEXSCOPE_PROXY_BASE', '').strip()
102
+ valid_key = bool(key) and not any(c.isspace() or ord(c) < 32 for c in key)
103
+ check('environment-key', 'PASS' if valid_key else 'FAIL',
104
+ 'Key is configured; server validity not tested.' if valid_key else 'Key is missing or malformed.',
105
+ None if valid_key else 'Configure NEXSCOPE_API_KEY privately; never paste it into diagnostic output.')
106
+ try:
107
+ if api_base is not None:
108
+ raise Failure('Independent mode uses its environment origin.')
109
+ origin(base)
110
+ check('environment-origin', 'PASS', 'Origin syntax accepted; value omitted.')
111
+ except Failure:
112
+ check('environment-origin', 'FAIL', 'Environment origin missing/invalid or --api-base supplied.',
113
+ 'Configure NEXSCOPE_PROXY_BASE as an HTTPS origin; omit --api-base.')
114
+ if output_dir is not None:
115
+ try:
116
+ folder = Path(output_dir)
117
+ if not folder.is_dir():
118
+ raise OSError('Directory must already exist.')
119
+ with tempfile.TemporaryDirectory(prefix='.nexscope-doctor-', dir=folder) as probe:
120
+ target = Path(probe) / 'probe'
121
+ target.write_bytes(b'nexscope-doctor')
122
+ if target.read_bytes() != b'nexscope-doctor':
123
+ raise OSError('Readback mismatch.')
124
+ check('output-directory', 'PASS', 'Created, read and removed only a temporary probe directory.')
125
+ except Exception:
126
+ check('output-directory', 'FAIL', 'Output directory probe failed; path and exception details omitted.',
127
+ 'Choose an existing writable directory; check disk space and path length.')
128
+ else:
129
+ check('output-directory', 'NOT_CHECKED', 'No files written.', 'Optionally pass --check-output with an existing directory.')
130
+ failed = any(c['status'] == 'FAIL' for c in checks)
131
+ warnings = any(c['status'] == 'WARN' for c in checks)
132
+ return {'schemaVersion': 1, 'status': 'FAILED' if failed else 'WARNING' if warnings else 'READY_LOCAL',
133
+ 'version': __version__, 'profile': profile, 'os': sys.platform, 'checks': checks,
134
+ 'network': 'NOT_RUN', 'storedCredentials': 'NOT_READ', 'telemetry': 'NONE',
135
+ 'environmentValues': 'syntax checked without output' if profile == 'independent' else 'NOT_READ',
136
+ 'scope': 'Local prerequisites only; not authenticated, live-service or assistant-host acceptance.'}