bidtry-accessibility-improve 0.0.0-stage → 0.1.1

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.
@@ -0,0 +1,483 @@
1
+ Bidtry — Open Source Acknowledgements
2
+
3
+ Original project: axe-core / Deque Systems, Inc.
4
+
5
+ ========================================================================
6
+ Original file: LICENSE
7
+ ========================================================================
8
+
9
+ Mozilla Public License, version 2.0
10
+
11
+ 1. Definitions
12
+
13
+ 1.1. "Contributor"
14
+
15
+ means each individual or legal entity that creates, contributes to the
16
+ creation of, or owns Covered Software.
17
+
18
+ 1.2. "Contributor Version"
19
+
20
+ means the combination of the Contributions of others (if any) used by a
21
+ Contributor and that particular Contributor's Contribution.
22
+
23
+ 1.3. "Contribution"
24
+
25
+ means Covered Software of a particular Contributor.
26
+
27
+ 1.4. "Covered Software"
28
+
29
+ means Source Code Form to which the initial Contributor has attached the
30
+ notice in Exhibit A, the Executable Form of such Source Code Form, and
31
+ Modifications of such Source Code Form, in each case including portions
32
+ thereof.
33
+
34
+ 1.5. "Incompatible With Secondary Licenses"
35
+ means
36
+
37
+ a. that the initial Contributor has attached the notice described in
38
+ Exhibit B to the Covered Software; or
39
+
40
+ b. that the Covered Software was made available under the terms of
41
+ version 1.1 or earlier of the License, but not also under the terms of
42
+ a Secondary License.
43
+
44
+ 1.6. "Executable Form"
45
+
46
+ means any form of the work other than Source Code Form.
47
+
48
+ 1.7. "Larger Work"
49
+
50
+ means a work that combines Covered Software with other material, in a
51
+ separate file or files, that is not Covered Software.
52
+
53
+ 1.8. "License"
54
+
55
+ means this document.
56
+
57
+ 1.9. "Licensable"
58
+
59
+ means having the right to grant, to the maximum extent possible, whether
60
+ at the time of the initial grant or subsequently, any and all of the
61
+ rights conveyed by this License.
62
+
63
+ 1.10. "Modifications"
64
+
65
+ means any of the following:
66
+
67
+ a. any file in Source Code Form that results from an addition to,
68
+ deletion from, or modification of the contents of Covered Software; or
69
+
70
+ b. any new file in Source Code Form that contains any Covered Software.
71
+
72
+ 1.11. "Patent Claims" of a Contributor
73
+
74
+ means any patent claim(s), including without limitation, method,
75
+ process, and apparatus claims, in any patent Licensable by such
76
+ Contributor that would be infringed, but for the grant of the License,
77
+ by the making, using, selling, offering for sale, having made, import,
78
+ or transfer of either its Contributions or its Contributor Version.
79
+
80
+ 1.12. "Secondary License"
81
+
82
+ means either the GNU General Public License, Version 2.0, the GNU Lesser
83
+ General Public License, Version 2.1, the GNU Affero General Public
84
+ License, Version 3.0, or any later versions of those licenses.
85
+
86
+ 1.13. "Source Code Form"
87
+
88
+ means the form of the work preferred for making modifications.
89
+
90
+ 1.14. "You" (or "Your")
91
+
92
+ means an individual or a legal entity exercising rights under this
93
+ License. For legal entities, "You" includes any entity that controls, is
94
+ controlled by, or is under common control with You. For purposes of this
95
+ definition, "control" means (a) the power, direct or indirect, to cause
96
+ the direction or management of such entity, whether by contract or
97
+ otherwise, or (b) ownership of more than fifty percent (50%) of the
98
+ outstanding shares or beneficial ownership of such entity.
99
+
100
+
101
+ 2. License Grants and Conditions
102
+
103
+ 2.1. Grants
104
+
105
+ Each Contributor hereby grants You a world-wide, royalty-free,
106
+ non-exclusive license:
107
+
108
+ a. under intellectual property rights (other than patent or trademark)
109
+ Licensable by such Contributor to use, reproduce, make available,
110
+ modify, display, perform, distribute, and otherwise exploit its
111
+ Contributions, either on an unmodified basis, with Modifications, or
112
+ as part of a Larger Work; and
113
+
114
+ b. under Patent Claims of such Contributor to make, use, sell, offer for
115
+ sale, have made, import, and otherwise transfer either its
116
+ Contributions or its Contributor Version.
117
+
118
+ 2.2. Effective Date
119
+
120
+ The licenses granted in Section 2.1 with respect to any Contribution
121
+ become effective for each Contribution on the date the Contributor first
122
+ distributes such Contribution.
123
+
124
+ 2.3. Limitations on Grant Scope
125
+
126
+ The licenses granted in this Section 2 are the only rights granted under
127
+ this License. No additional rights or licenses will be implied from the
128
+ distribution or licensing of Covered Software under this License.
129
+ Notwithstanding Section 2.1(b) above, no patent license is granted by a
130
+ Contributor:
131
+
132
+ a. for any code that a Contributor has removed from Covered Software; or
133
+
134
+ b. for infringements caused by: (i) Your and any other third party's
135
+ modifications of Covered Software, or (ii) the combination of its
136
+ Contributions with other software (except as part of its Contributor
137
+ Version); or
138
+
139
+ c. under Patent Claims infringed by Covered Software in the absence of
140
+ its Contributions.
141
+
142
+ This License does not grant any rights in the trademarks, service marks,
143
+ or logos of any Contributor (except as may be necessary to comply with
144
+ the notice requirements in Section 3.4).
145
+
146
+ 2.4. Subsequent Licenses
147
+
148
+ No Contributor makes additional grants as a result of Your choice to
149
+ distribute the Covered Software under a subsequent version of this
150
+ License (see Section 10.2) or under the terms of a Secondary License (if
151
+ permitted under the terms of Section 3.3).
152
+
153
+ 2.5. Representation
154
+
155
+ Each Contributor represents that the Contributor believes its
156
+ Contributions are its original creation(s) or it has sufficient rights to
157
+ grant the rights to its Contributions conveyed by this License.
158
+
159
+ 2.6. Fair Use
160
+
161
+ This License is not intended to limit any rights You have under
162
+ applicable copyright doctrines of fair use, fair dealing, or other
163
+ equivalents.
164
+
165
+ 2.7. Conditions
166
+
167
+ Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in
168
+ Section 2.1.
169
+
170
+
171
+ 3. Responsibilities
172
+
173
+ 3.1. Distribution of Source Form
174
+
175
+ All distribution of Covered Software in Source Code Form, including any
176
+ Modifications that You create or to which You contribute, must be under
177
+ the terms of this License. You must inform recipients that the Source
178
+ Code Form of the Covered Software is governed by the terms of this
179
+ License, and how they can obtain a copy of this License. You may not
180
+ attempt to alter or restrict the recipients' rights in the Source Code
181
+ Form.
182
+
183
+ 3.2. Distribution of Executable Form
184
+
185
+ If You distribute Covered Software in Executable Form then:
186
+
187
+ a. such Covered Software must also be made available in Source Code Form,
188
+ as described in Section 3.1, and You must inform recipients of the
189
+ Executable Form how they can obtain a copy of such Source Code Form by
190
+ reasonable means in a timely manner, at a charge no more than the cost
191
+ of distribution to the recipient; and
192
+
193
+ b. You may distribute such Executable Form under the terms of this
194
+ License, or sublicense it under different terms, provided that the
195
+ license for the Executable Form does not attempt to limit or alter the
196
+ recipients' rights in the Source Code Form under this License.
197
+
198
+ 3.3. Distribution of a Larger Work
199
+
200
+ You may create and distribute a Larger Work under terms of Your choice,
201
+ provided that You also comply with the requirements of this License for
202
+ the Covered Software. If the Larger Work is a combination of Covered
203
+ Software with a work governed by one or more Secondary Licenses, and the
204
+ Covered Software is not Incompatible With Secondary Licenses, this
205
+ License permits You to additionally distribute such Covered Software
206
+ under the terms of such Secondary License(s), so that the recipient of
207
+ the Larger Work may, at their option, further distribute the Covered
208
+ Software under the terms of either this License or such Secondary
209
+ License(s).
210
+
211
+ 3.4. Notices
212
+
213
+ You may not remove or alter the substance of any license notices
214
+ (including copyright notices, patent notices, disclaimers of warranty, or
215
+ limitations of liability) contained within the Source Code Form of the
216
+ Covered Software, except that You may alter any license notices to the
217
+ extent required to remedy known factual inaccuracies.
218
+
219
+ 3.5. Application of Additional Terms
220
+
221
+ You may choose to offer, and to charge a fee for, warranty, support,
222
+ indemnity or liability obligations to one or more recipients of Covered
223
+ Software. However, You may do so only on Your own behalf, and not on
224
+ behalf of any Contributor. You must make it absolutely clear that any
225
+ such warranty, support, indemnity, or liability obligation is offered by
226
+ You alone, and You hereby agree to indemnify every Contributor for any
227
+ liability incurred by such Contributor as a result of warranty, support,
228
+ indemnity or liability terms You offer. You may include additional
229
+ disclaimers of warranty and limitations of liability specific to any
230
+ jurisdiction.
231
+
232
+ 4. Inability to Comply Due to Statute or Regulation
233
+
234
+ If it is impossible for You to comply with any of the terms of this License
235
+ with respect to some or all of the Covered Software due to statute,
236
+ judicial order, or regulation then You must: (a) comply with the terms of
237
+ this License to the maximum extent possible; and (b) describe the
238
+ limitations and the code they affect. Such description must be placed in a
239
+ text file included with all distributions of the Covered Software under
240
+ this License. Except to the extent prohibited by statute or regulation,
241
+ such description must be sufficiently detailed for a recipient of ordinary
242
+ skill to be able to understand it.
243
+
244
+ 5. Termination
245
+
246
+ 5.1. The rights granted under this License will terminate automatically if You
247
+ fail to comply with any of its terms. However, if You become compliant,
248
+ then the rights granted under this License from a particular Contributor
249
+ are reinstated (a) provisionally, unless and until such Contributor
250
+ explicitly and finally terminates Your grants, and (b) on an ongoing
251
+ basis, if such Contributor fails to notify You of the non-compliance by
252
+ some reasonable means prior to 60 days after You have come back into
253
+ compliance. Moreover, Your grants from a particular Contributor are
254
+ reinstated on an ongoing basis if such Contributor notifies You of the
255
+ non-compliance by some reasonable means, this is the first time You have
256
+ received notice of non-compliance with this License from such
257
+ Contributor, and You become compliant prior to 30 days after Your receipt
258
+ of the notice.
259
+
260
+ 5.2. If You initiate litigation against any entity by asserting a patent
261
+ infringement claim (excluding declaratory judgment actions,
262
+ counter-claims, and cross-claims) alleging that a Contributor Version
263
+ directly or indirectly infringes any patent, then the rights granted to
264
+ You by any and all Contributors for the Covered Software under Section
265
+ 2.1 of this License shall terminate.
266
+
267
+ 5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user
268
+ license agreements (excluding distributors and resellers) which have been
269
+ validly granted by You or Your distributors under this License prior to
270
+ termination shall survive termination.
271
+
272
+ 6. Disclaimer of Warranty
273
+
274
+ Covered Software is provided under this License on an "as is" basis,
275
+ without warranty of any kind, either expressed, implied, or statutory,
276
+ including, without limitation, warranties that the Covered Software is free
277
+ of defects, merchantable, fit for a particular purpose or non-infringing.
278
+ The entire risk as to the quality and performance of the Covered Software
279
+ is with You. Should any Covered Software prove defective in any respect,
280
+ You (not any Contributor) assume the cost of any necessary servicing,
281
+ repair, or correction. This disclaimer of warranty constitutes an essential
282
+ part of this License. No use of any Covered Software is authorized under
283
+ this License except under this disclaimer.
284
+
285
+ 7. Limitation of Liability
286
+
287
+ Under no circumstances and under no legal theory, whether tort (including
288
+ negligence), contract, or otherwise, shall any Contributor, or anyone who
289
+ distributes Covered Software as permitted above, be liable to You for any
290
+ direct, indirect, special, incidental, or consequential damages of any
291
+ character including, without limitation, damages for lost profits, loss of
292
+ goodwill, work stoppage, computer failure or malfunction, or any and all
293
+ other commercial damages or losses, even if such party shall have been
294
+ informed of the possibility of such damages. This limitation of liability
295
+ shall not apply to liability for death or personal injury resulting from
296
+ such party's negligence to the extent applicable law prohibits such
297
+ limitation. Some jurisdictions do not allow the exclusion or limitation of
298
+ incidental or consequential damages, so this exclusion and limitation may
299
+ not apply to You.
300
+
301
+ 8. Litigation
302
+
303
+ Any litigation relating to this License may be brought only in the courts
304
+ of a jurisdiction where the defendant maintains its principal place of
305
+ business and such litigation shall be governed by laws of that
306
+ jurisdiction, without reference to its conflict-of-law provisions. Nothing
307
+ in this Section shall prevent a party's ability to bring cross-claims or
308
+ counter-claims.
309
+
310
+ 9. Miscellaneous
311
+
312
+ This License represents the complete agreement concerning the subject
313
+ matter hereof. If any provision of this License is held to be
314
+ unenforceable, such provision shall be reformed only to the extent
315
+ necessary to make it enforceable. Any law or regulation which provides that
316
+ the language of a contract shall be construed against the drafter shall not
317
+ be used to construe this License against a Contributor.
318
+
319
+
320
+ 10. Versions of the License
321
+
322
+ 10.1. New Versions
323
+
324
+ Mozilla Foundation is the license steward. Except as provided in Section
325
+ 10.3, no one other than the license steward has the right to modify or
326
+ publish new versions of this License. Each version will be given a
327
+ distinguishing version number.
328
+
329
+ 10.2. Effect of New Versions
330
+
331
+ You may distribute the Covered Software under the terms of the version
332
+ of the License under which You originally received the Covered Software,
333
+ or under the terms of any subsequent version published by the license
334
+ steward.
335
+
336
+ 10.3. Modified Versions
337
+
338
+ If you create software not governed by this License, and you want to
339
+ create a new license for such software, you may create and use a
340
+ modified version of this License if you rename the license and remove
341
+ any references to the name of the license steward (except to note that
342
+ such modified license differs from this License).
343
+
344
+ 10.4. Distributing Source Code Form that is Incompatible With Secondary
345
+ Licenses If You choose to distribute Source Code Form that is
346
+ Incompatible With Secondary Licenses under the terms of this version of
347
+ the License, the notice described in Exhibit B of this License must be
348
+ attached.
349
+
350
+ Exhibit A - Source Code Form License Notice
351
+
352
+ This Source Code Form is subject to the
353
+ terms of the Mozilla Public License, v.
354
+ 2.0. If a copy of the MPL was not
355
+ distributed with this file, You can
356
+ obtain one at
357
+ http://mozilla.org/MPL/2.0/.
358
+
359
+ If it is not possible or desirable to put the notice in a particular file,
360
+ then You may include the notice in a location (such as a LICENSE file in a
361
+ relevant directory) where a recipient would be likely to look for such a
362
+ notice.
363
+
364
+ You may add additional accurate notices of copyright ownership.
365
+
366
+ Exhibit B - "Incompatible With Secondary Licenses" Notice
367
+
368
+ This Source Code Form is "Incompatible
369
+ With Secondary Licenses", as defined by
370
+ the Mozilla Public License, v. 2.0.
371
+
372
+ ========================================================================
373
+ Original file: LICENSE-3RD-PARTY.txt
374
+ ========================================================================
375
+
376
+ -----------------------------------------------------------------------------
377
+ MIT License
378
+ Applies to:
379
+ - colorjs.io; Copyright (c) 2021 Lea Verou, Chris Lilley
380
+ - core-js-pure; Copyright (c) 2014-2023 Denis Pushkarev
381
+ - css-selector-parser; Copyright (c) 2013 Dulin Marat
382
+ - doT.js; Copyright (c) 2011 Laura Doktorova
383
+ Software includes portions from jQote2 Copyright (c) 2010 aefxx,
384
+ http://aefxx.com/ licensed under the MIT license.
385
+ - emoji-regex; Copyright (c) Mathias Bynens <https://mathiasbynens.be/>
386
+ - es6-iterator; Copyright (c) 2013-2017 Mariusz Nowak (www.medikoo.com)
387
+ - es6-promise;
388
+ Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors
389
+ - event-emitter; Copyright (C) 2012-2015 Mariusz Nowak (www.medikoo.com)
390
+ - is-promise; Copyright (c) 2014 Forbes Lindesay
391
+ - lru-queue; Copyright (C) 2014 Mariusz Nowak (www.medikoo.com)
392
+ - typedarray;
393
+ Copyright (c) 2010, Linden Research, Inc.
394
+ Copyright (c) 2012, Joshua Bell
395
+ - weakmap-polyfill; Copyright (c) 2015-2021 polygonplanet
396
+ -----------------------------------------------------------------------------
397
+
398
+ Permission is hereby granted, free of charge, to any person obtaining a copy
399
+ of this software and associated documentation files (the "Software"), to deal
400
+ in the Software without restriction, including without limitation the rights
401
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
402
+ copies of the Software, and to permit persons to whom the Software is
403
+ furnished to do so, subject to the following conditions:
404
+
405
+ The above copyright notice and this permission notice shall be included in
406
+ all copies or substantial portions of the Software.
407
+
408
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
409
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
410
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
411
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
412
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
413
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
414
+ THE SOFTWARE.
415
+
416
+
417
+ -----------------------------------------------------------------------------
418
+ ISC License
419
+ Applies to:
420
+ - d; Copyright (c) 2013-2019, Mariusz Nowak, @medikoo, medikoo.com
421
+ - es5-ext; Copyright (c) 2011-2022, Mariusz Nowak, @medikoo, medikoo.com
422
+ - es6-symbol; Copyright (c) 2013-2019, Mariusz Nowak, @medikoo, medikoo.com
423
+ - es6-weak-map; Copyright (c) 2013-2018, Mariusz Nowak, @medikoo, medikoo.com
424
+ - ext; Copyright (c) 2011-2022, Mariusz Nowak, @medikoo, medikoo.com
425
+ - memoizee; Copyright (c) 2012-2018, Mariusz Nowak, @medikoo, medikoo.com
426
+ - next-tick; Copyright (c) 2012-2020, Mariusz Nowak, @medikoo, medikoo.com
427
+ - timers-ext; Copyright (c) 2013-2018, Mariusz Nowak, @medikoo, medikoo.com
428
+ - type; Copyright (c) 2019, Mariusz Nowak, @medikoo, medikoo.com
429
+ -----------------------------------------------------------------------------
430
+
431
+ Permission to use, copy, modify, and/or distribute this software for any
432
+ purpose with or without fee is hereby granted, provided that the above
433
+ copyright notice and this permission notice appear in all copies.
434
+
435
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
436
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
437
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
438
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
439
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
440
+ OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
441
+ PERFORMANCE OF THIS SOFTWARE.
442
+
443
+ ========================================================================
444
+ Original file: NOTICE.md
445
+ ========================================================================
446
+
447
+ # Bidtry Accessibility Improve notices
448
+
449
+ Bidtry Accessibility Improve is maintained by Bidtry and is derived from the
450
+ `axe-core` project originally developed by Deque Systems, Inc.
451
+
452
+ Bidtry modifications are Copyright (c) 2026 Bidtry.
453
+
454
+ Original copyright and contributor notices remain with their respective
455
+ owners. The covered source is distributed under the Mozilla Public License,
456
+ version 2.0. See `LICENSE`. Bundled third-party software is distributed under
457
+ its own terms. See `LICENSE-3RD-PARTY.txt`.
458
+
459
+ DEQUE, DEQUELABS, AXE, and AXE-CORE are trademarks of Deque Systems, Inc.
460
+ Bidtry is not affiliated with or endorsed by Deque Systems.
461
+
462
+ ## Bidtry product attribution
463
+
464
+ Bidtry Accessibility Improve is the Bidtry-maintained project in this directory. Its implementation is derived from axe-core and retains compatible technical identifiers.
465
+
466
+ Original authorship, copyright notices, project license terms, and third-party licenses remain with their respective holders. Bidtry branding does not replace those notices.
467
+
468
+ ========================================================================
469
+ Original file: lib/intro.stub
470
+ ========================================================================
471
+
472
+ /*! Bidtry Accessibility Improve v<%= pkg.version %>
473
+ * Bidtry modifications Copyright (c) <%= year %> Bidtry.
474
+ * Copyright (c) 2015 - <%= year %> Deque Systems, Inc.
475
+ *
476
+ * Your use of this Source Code Form is subject to the terms of the Mozilla Public
477
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
478
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
479
+ *
480
+ * This entire copyright notice must appear in every copy of this file you
481
+ * distribute or in any file that contains substantial portions of this source
482
+ * code.
483
+ */
package/README.md CHANGED
@@ -1,3 +1,43 @@
1
- # Temporary Holding Version
1
+ # Bidtry Accessibility Improve
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ **Brand:** Bidtry · **Developer:** Keshab Amgain
4
+
5
+ Bidtry Accessibility Improve: install project-local workflow instructions. Native engines are separate.
6
+
7
+ A workflow for websites, forms, and HTML interfaces.
8
+
9
+ ## Why use it?
10
+
11
+ A page can look finished while keyboard, labeling, or contrast problems still block people. Start with a focused check, review confirmed and incomplete results, then verify the experience in the browser.
12
+
13
+ ## Install
14
+
15
+ Requires Node.js 20 or newer. Open a terminal in your existing project folder, then run this command on macOS, Windows PowerShell, or Linux:
16
+
17
+ ```sh
18
+ npx bidtry-accessibility-improve@0.1.1 install --target .
19
+ ```
20
+
21
+ The command installs and verifies workflow files under `.bidtry/skills/`. No particular coding assistant is required. Open `.bidtry/skills/bidtry-accessibility-improve/START-HERE.md`, then read the workflow in `SKILL.md`. You can follow the instructions yourself or share them with your preferred assistant.
22
+
23
+ ## Preview, verify, and remove
24
+
25
+ ```sh
26
+ npx bidtry-accessibility-improve@0.1.1 install --target . --dry-run
27
+ npx bidtry-accessibility-improve@0.1.1 verify --target .
28
+ npx bidtry-accessibility-improve@0.1.1 uninstall --target . --dry-run
29
+ ```
30
+
31
+ Remove `--dry-run` from the removal command only when ready. Unknown or edited files are preserved by refusing unsafe changes. Symlinked destinations are rejected.
32
+
33
+ Optional assistant integrations: pass `--agent codex`, `--agent claude`, or `--agent cursor`. These place instructions in that assistant's project skill directory. Start a new assistant session after installing. Dollar-sign and slash examples inside skill files are assistant requests, not terminal commands.
34
+
35
+ ## What is included?
36
+
37
+ Workflow instructions and their supporting reference files. This npm release does not install a standalone application, native engine, compiler, browser, solver, API service, or project dependencies. Some workflow checks need separately installed native tools. They are not certified by installing these instructions. There are no npm runtime dependencies or install lifecycle scripts.
38
+
39
+ ## Copyright and license texts
40
+
41
+ Original copyright notices and full license texts are included in `BIDTRY_TEAM_SOURCE.txt`. Different included materials retain their original terms. Bidtry branding does not replace original authorship.
42
+
43
+ [Tool information](https://bidtry.com/accessibility-improve)
package/SOURCE.json ADDED
@@ -0,0 +1,15 @@
1
+ {
2
+ "package": "bidtry-accessibility-improve@0.1.1",
3
+ "artifactKind": "project-local workflow installer; native engines excluded",
4
+ "runtimeSha256": "8a5a2db03bee2339c0d6085242a3fbdb1988f9bb75cc191683d48394cd52e00f",
5
+ "bundledRuntimeSha256": "63463a6a3497d305b5d6b7c7403fae2a303aff986095721db1d2cec0121577a4",
6
+ "payloadSha256": "2d246b77615dad232ed506d800a57d1c3af0c9d9ba9fc588abc01ff2b6bea6d1",
7
+ "products": [
8
+ {
9
+ "name": "bidtry-accessibility-improve",
10
+ "version": "0.1.1",
11
+ "slug": "accessibility-improve"
12
+ }
13
+ ],
14
+ "noticeSha256": "5b9175eb069486cc2b20067b5a3f57de129d8f011b77c6142686a12f8a473910"
15
+ }
package/bin/cli.mjs ADDED
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env node
2
+ import { runCli } from '../lib/runtime.mjs';
3
+ const product = {"name":"bidtry-accessibility-improve","title":"Bidtry Accessibility Improve","slug":"accessibility-improve","version":"0.1.1"};
4
+ const args = process.argv.slice(2);
5
+ const command = args[0];
6
+ const help = "\nBidtry Accessibility Improve — project workflow installer\n\nUsage:\n bidtry-accessibility-improve install [--target PATH] [--agent project|codex|claude|cursor|all] [--dry-run]\n bidtry-accessibility-improve verify [options]\n bidtry-accessibility-improve uninstall [options] [--dry-run]\n bidtry-accessibility-improve list\n\nDefault: editor-readable workflow files in .bidtry/skills/ inside your project.\nInstall verifies the managed files automatically. Requires Node.js 20 or newer.\nThis package installs workflow instructions, not native engines or application dependencies.\nOriginal copyright notices and license texts: BIDTRY_TEAM_SOURCE.txt\n";
7
+ try {
8
+ if (!command || args.includes('--help') || args.includes('-h') || command === 'help') {
9
+ process.stdout.write(help);
10
+ } else if (args.includes('--version') || args.includes('-v') || command === 'version') {
11
+ process.stdout.write("0.1.1" + '\n');
12
+ } else {
13
+ if (!['install', 'verify', 'uninstall', 'remove', 'list'].includes(command)) throw new Error('Unknown command. Use --help.');
14
+ if (product && args.some(value => /^--(?:tool|tools|preset)(?:=|$)/.test(value))) throw new Error('This package installs ' + product.name + ' only. Use @bidtry/tools to choose other tools.');
15
+ const options = args.slice(1);
16
+ if (!args.some(value => /^--agent(?:=|$)/.test(value))) options.push('--agent', 'project');
17
+ if (product && command !== 'list') options.push('--tool', product.slug);
18
+ process.stdout.write(runCli([command, ...options], process.cwd()));
19
+ if (command === 'install' && !args.includes('--dry-run')) process.stdout.write(runCli(['verify', ...options], process.cwd()));
20
+ }
21
+ } catch (error) {
22
+ process.stderr.write(error.message + '\n');
23
+ process.exitCode = 1;
24
+ }
@@ -0,0 +1,502 @@
1
+ #!/usr/bin/env node
2
+ import { createHash, randomUUID } from 'node:crypto';
3
+ import {
4
+ chmodSync,
5
+ existsSync,
6
+ lstatSync,
7
+ mkdirSync,
8
+ readFileSync,
9
+ readdirSync,
10
+ realpathSync,
11
+ renameSync,
12
+ rmdirSync,
13
+ unlinkSync,
14
+ writeFileSync
15
+ } from 'node:fs';
16
+ import path from 'node:path';
17
+ import { pathToFileURL } from 'node:url';
18
+
19
+ export default runCli;
20
+
21
+ const INSTALLER_VERSION = '1.1.0';
22
+ const PAYLOAD = JSON.parse(Buffer.from('eyJzY2hlbWFWZXJzaW9uIjoxLCJwcm9kdWN0cyI6W3sic2x1ZyI6ImFjY2Vzc2liaWxpdHktaW1wcm92ZSIsIm5hbWUiOiJiaWR0cnktYWNjZXNzaWJpbGl0eS1pbXByb3ZlIiwidGl0bGUiOiJCaWR0cnkgQWNjZXNzaWJpbGl0eSBJbXByb3ZlIiwidmVyc2lvbiI6IjAuMS4xIiwicHJpbWFyeUFjdGlvbiI6ImF1ZGl0IiwiZmlsZXMiOnsiYWdlbnRzL29wZW5haS55YW1sIjp7ImNvbnRlbnQiOiJpbnRlcmZhY2U6XG4gIGRpc3BsYXlfbmFtZTogJ0JpZHRyeSBBY2Nlc3NpYmlsaXR5IEltcHJvdmUnXG4gIHNob3J0X2Rlc2NyaXB0aW9uOiAnQmlkdHJ5IEFjY2Vzc2liaWxpdHkgSW1wcm92ZSBwcm9qZWN0IHdvcmtmbG93cydcbiAgZGVmYXVsdF9wcm9tcHQ6ICdVc2UgJGJpZHRyeS1hY2Nlc3NpYmlsaXR5LWltcHJvdmUgYXVkaXQgY2hlY2tvdXQgZm9ybS4nXG4iLCJtb2RlIjo0MjB9LCJTS0lMTC5tZCI6eyJjb250ZW50IjoiLS0tXG5uYW1lOiBiaWR0cnktYWNjZXNzaWJpbGl0eS1pbXByb3ZlXG5kZXNjcmlwdGlvbjogJ0F1dG9tYXRlZCBhY2Nlc3NpYmlsaXR5IHRlc3RpbmcgZm9yIHdlYnNpdGVzIGFuZCBIVE1MIGludGVyZmFjZXMuIFVzZSBmb3IgY2hlY2tvdXQgZm9ybSBhbmQgcmVsYXRlZCBhY2Nlc3NpYmlsaXR5IGltcHJvdmUgdGFza3MgaW4gYW4gZXhpc3RpbmcgbG9jYWwgcHJvamVjdC4nXG4tLS1cblxuIyBCaWR0cnkgQWNjZXNzaWJpbGl0eSBJbXByb3ZlXG5cblVzZSB0aGlzIHNraWxsIGluIHRoZSB0YXJnZXQgcHJvamVjdC4gUmVhZCBpdHMgcmVwb3NpdG9yeSBpbnN0cnVjdGlvbnMgZmlyc3QgYW5kIHVzZSBpdHMgZXhpc3RpbmcgYXJjaGl0ZWN0dXJlLCBwYWNrYWdlIG1hbmFnZXIsIGFuZCBhdXRob3JpemF0aW9uIHNjb3BlLiBSZWFkIHRoZSByZWxldmFudCBzZWN0aW9uIG9mIEJJRFRSWS5tZCB3aGVuIHByZXNlbnQuXG5cbiMjIEludm9jYXRpb25cblxuSW4gQ29kZXgsIHVzZSBgJGJpZHRyeS1hY2Nlc3NpYmlsaXR5LWltcHJvdmUgaW5pdGAsIHRoZW4gYCRiaWR0cnktYWNjZXNzaWJpbGl0eS1pbXByb3ZlIGF1ZGl0IGNoZWNrb3V0IGZvcm1gLiBJbiBDbGF1ZGUgQ29kZSBvciBDdXJzb3IsIHVzZSB0aGUgY29ycmVzcG9uZGluZyBgL2JpZHRyeS1hY2Nlc3NpYmlsaXR5LWltcHJvdmVgIHNraWxsIGNvbW1hbmQuIFRoZXNlIGFyZSBjb2RpbmctYWdlbnQgcmVxdWVzdHMsIG5vdCB0ZXJtaW5hbCBjb21tYW5kcy5cblxuIyMgTW9kZXNcblxuLSBgaW5pdGA6IFJlYWQgcmVwb3NpdG9yeSBpbnN0cnVjdGlvbnMgYW5kIGFueSBQUk9EVUNULm1kIG9yIEJJRFRSWS5tZC4gRXN0YWJsaXNoIHRoZSB0YXJnZXQsIHVzZXJzLCBjb25zdHJhaW50cywgYW5kIGFncmVlZCB2ZXJpZmljYXRpb24gY29tbWFuZHMuIENyZWF0ZSBvciB1cGRhdGUgb25seSB0aGlzIHRvb2zigJlzIHNlY3Rpb24gaW4gQklEVFJZLm1kLCBwcmVzZXJ2aW5nIG90aGVyIGNvbnRleHQgYW5kIHVzZXIgZWRpdHMuIEFzayBvbmx5IGZvciBmYWN0cyB0aGF0IGNhbm5vdCBiZSBpbmZlcnJlZCBhbmQgbWF0ZXJpYWxseSBjaGFuZ2UgdGhlIHdvcmsuXG4tIGBhdWRpdGA6IEFwcGx5IHRoZSBkb21haW4gd29ya2Zsb3cgYmVsb3cgdG8gdGhlIHNwZWNpZmllZCB0YXJnZXQsIGtlZXBpbmcgdGhlIHVzZXLigJlzIHJlcXVlc3RlZCBvdXRjb21lIGFuZCBzY29wZS5cbi0gYGZpeGA6IEltcGxlbWVudCB0aGUgcmVxdWVzdGVkIGNvcnJlY3Rpb24sIHByZXNlcnZlIHVucmVsYXRlZCBiZWhhdmlvciBhbmQgY29uZmlndXJhdGlvbiwgYW5kIHZlcmlmeSB0aGUgYWZmZWN0ZWQgcmVzdWx0LlxuLSBgdmVyaWZ5YDogUnVuIHRoZSByZWxldmFudCBjaGVja3MgYWdyZWVkIGR1cmluZyBpbml0IHdoZW4gdGhleSBhcmUgYXZhaWxhYmxlLiBSZXBvcnQgZXhhY3QgcmVzdWx0cyBhbmQgYmxvY2tlcnM7IGRvIG5vdCBmYWJyaWNhdGUgZXhlY3V0aW9uIG9yIGEgcGFzc2luZyByZXN1bHQuXG5cbldoZW4gbm8gbW9kZSBpcyBzdXBwbGllZCwgaW5mZXIgdGhlIGFjdGlvbiBmcm9tIHRoZSB1c2Vy4oCZcyByZXF1ZXN0OyBhc2sgb25seSBpZiB0aGUgaW50ZW5kZWQgb3V0Y29tZSBpcyBnZW51aW5lbHkgYW1iaWd1b3VzLlxuXG4jIyBEb21haW4gd29ya2Zsb3dcblxuLSBDaGVjayBzZW1hbnRpYyBuYW1lcywgcm9sZXMsIGtleWJvYXJkIG9wZXJhdGlvbiwgZm9jdXMgb3JkZXIsIGFuZCB0aGUgdGFyZ2V04oCZcyBkZWNsYXJlZCBXQ0FHIHJlcXVpcmVtZW50cy5cbi0gVHJlYXQgdW5jZXJ0YWluIGNvbnRyYXN0L2JhY2tncm91bmQgY2FsY3VsYXRpb25zIGFuZCB1bnRlc3RlZCBzY3JlZW4tcmVhZGVyIGJlaGF2aW9yIGFzIGluY29tcGxldGUsIG5vdCBhIHBhc3MuXG4tIEluY2x1ZGUgYXJpYS1oaWRkZW4gYW5jZXN0b3JzIGFuZCByZWxldmFudCBzaGFkb3cgYm91bmRhcmllcyB3aGVuIHRoZXkgYWZmZWN0IHRoZSByZXN1bHQuXG5cbiMjIE5hdGl2ZSB0b29sIGJvdW5kYXJ5XG5cblRoZSBpbnN0YWxsZXIgYWRkcyBhZ2VudCBpbnN0cnVjdGlvbnMgb25seS4gSXQgZG9lcyBub3QgaW5zdGFsbCBvciBidW5kbGUgYXhlLWNvbXBhdGlibGUgYWNjZXNzaWJpbGl0eSBBUEkgYW5kIHRoZSB0YXJnZXQgcHJvamVjdOKAmXMgYnJvd3NlciB0ZXN0IHJ1bm5lci4gSW5zcGVjdCB0aGUgdGFyZ2V04oCZcyBhY3R1YWwgZGVwZW5kZW5jaWVzIGFuZCBhdmFpbGFibGUgdG9vbHMgYmVmb3JlIGludm9raW5nIG5hdGl2ZSBjaGVja3MuIFVzZSB0aGUgZXhpc3RpbmcgY29tcGF0aWJsZSBuYW1lcyB3aGVuIGEgdG9vbCBpcyBhbHJlYWR5IGNvbmZpZ3VyZWQuIElmIGEgbmF0aXZlIHRvb2wgaXMgbWlzc2luZywgc3RhdGUgdGhlIHNldHVwIGdhcCBhbmQgdGhlIGxpbWl0cyBvZiBhbnkgbWFudWFsIGFuYWx5c2lzLiBEbyBub3QgZmV0Y2ggYW4gdW52ZXJpZmllZCBwcml2YXRlIEJpZHRyeSBwYWNrYWdlLCBpbnN0YWxsIGEgc2Vjb25kIGFwcGxpY2F0aW9uIGludG8gdGhlIHRhcmdldCwgb3IgcmVwb3J0IG5hdGl2ZSBjaGVja3MgYXMgZXhlY3V0ZWQgd2hlbiB0aGV5IHdlcmUgbm90LlxuIiwibW9kZSI6NDIwfX19XX0=', 'base64').toString('utf8'));
23
+ const AGENT_PATHS = { codex: '.agents', claude: '.claude', cursor: '.cursor', project: '.bidtry' };
24
+ const MANIFEST = '.bidtry-install.json';
25
+ const DESIGN_PRESET = [
26
+ 'design-improve',
27
+ 'accessibility-improve',
28
+ 'graph-interface'
29
+ ];
30
+
31
+ function digest(contents) {
32
+ return createHash('sha256').update(contents).digest('hex');
33
+ }
34
+
35
+ function assertPayload() {
36
+ if (PAYLOAD?.schemaVersion !== 1 || !Array.isArray(PAYLOAD.products)) {
37
+ throw new Error('The Bidtry installer payload is missing or invalid.');
38
+ }
39
+ }
40
+
41
+ function productMap() {
42
+ assertPayload();
43
+ return new Map(PAYLOAD.products.map(product => [product.slug, product]));
44
+ }
45
+
46
+ function parseValue(args, index, option) {
47
+ const argument = args[index];
48
+ const value = argument.includes('=')
49
+ ? argument.slice(option.length + 1)
50
+ : args[index + 1];
51
+ if (!value || value.startsWith('--')) {
52
+ throw new Error(`Missing value for ${option}.`);
53
+ }
54
+ return { value, consumed: argument.includes('=') ? 0 : 1 };
55
+ }
56
+
57
+ /** Parse options without touching the target project. */
58
+ export function parseArguments(args, cwd) {
59
+ const knownCommands = new Set([
60
+ 'help',
61
+ 'version',
62
+ 'list',
63
+ 'install',
64
+ 'verify',
65
+ 'uninstall',
66
+ 'remove'
67
+ ]);
68
+ let command = 'help';
69
+ let agent = 'codex';
70
+ let target = cwd;
71
+ let dryRun = false;
72
+ let selector = null;
73
+ for (let index = 0; index < args.length; index += 1) {
74
+ const argument = args[index];
75
+ if (index === 0 && knownCommands.has(argument)) {
76
+ command = argument === 'remove' ? 'uninstall' : argument;
77
+ continue;
78
+ }
79
+ if (argument === '--help' || argument === '-h') {
80
+ command = 'help';
81
+ continue;
82
+ }
83
+ if (argument === '--version' || argument === '-v') {
84
+ command = 'version';
85
+ continue;
86
+ }
87
+ if (argument === '--dry-run') {
88
+ dryRun = true;
89
+ continue;
90
+ }
91
+ const option = argument.split('=', 1)[0];
92
+ if (!['--agent', '--target', '--tool', '--tools', '--preset'].includes(option)) {
93
+ throw new Error(`Unknown argument: ${argument}. Use --help for usage.`);
94
+ }
95
+ const parsed = parseValue(args, index, option);
96
+ index += parsed.consumed;
97
+ if (option === '--agent') agent = parsed.value;
98
+ if (option === '--target') target = parsed.value;
99
+ if (['--tool', '--tools', '--preset'].includes(option)) {
100
+ if (selector) {
101
+ throw new Error('Choose exactly one of --tool, --tools, or --preset.');
102
+ }
103
+ selector = { option, value: parsed.value };
104
+ }
105
+ }
106
+ if (agent !== 'all' && !Object.hasOwn(AGENT_PATHS, agent)) {
107
+ throw new Error(
108
+ `Unsupported installation format: ${agent}. Choose project, codex, claude, cursor, or all.`
109
+ );
110
+ }
111
+ if (['install', 'verify', 'uninstall'].includes(command) && !selector) {
112
+ throw new Error('Choose tools with --tool, --tools, or --preset.');
113
+ }
114
+ return {
115
+ command,
116
+ target: path.resolve(cwd, target),
117
+ agents: agent === 'all' ? ['codex', 'claude', 'cursor'] : [agent],
118
+ dryRun,
119
+ selector
120
+ };
121
+ }
122
+
123
+ function selectProducts(selector) {
124
+ const products = productMap();
125
+ let slugs;
126
+ if (selector.option === '--preset') {
127
+ if (selector.value === 'design') slugs = DESIGN_PRESET;
128
+ else if (selector.value === 'all') slugs = [...products.keys()].sort();
129
+ else throw new Error('Unsupported preset. Choose design or all.');
130
+ } else if (selector.option === '--tool') {
131
+ slugs = [selector.value];
132
+ } else {
133
+ slugs = selector.value.split(',').map(value => value.trim()).filter(Boolean);
134
+ }
135
+ if (!slugs.length) throw new Error('No tools were selected.');
136
+ if (new Set(slugs).size !== slugs.length) {
137
+ throw new Error('Tool selection contains duplicates.');
138
+ }
139
+ return slugs.map(slug => {
140
+ const product = products.get(slug);
141
+ if (!product) throw new Error(`Unknown Bidtry tool: ${slug}.`);
142
+ return product;
143
+ });
144
+ }
145
+
146
+ function assertRelative(relative) {
147
+ if (
148
+ typeof relative !== 'string' ||
149
+ !relative ||
150
+ path.isAbsolute(relative) ||
151
+ relative.split(/[\\/]/).includes('..')
152
+ ) {
153
+ throw new Error(`Invalid packaged file path: ${relative}`);
154
+ }
155
+ }
156
+
157
+ function assertRegularPath(root, relative) {
158
+ assertRelative(relative);
159
+ let current = root;
160
+ const parts = relative.split(/[\\/]/);
161
+ for (const [index, part] of parts.entries()) {
162
+ current = path.join(current, part);
163
+ let info;
164
+ try {
165
+ info = lstatSync(current);
166
+ } catch (error) {
167
+ if (error.code === 'ENOENT') return;
168
+ throw error;
169
+ }
170
+ if (info.isSymbolicLink()) {
171
+ throw new Error(`Refusing to follow a symlink: ${current}`);
172
+ }
173
+ if (index < parts.length - 1 && !info.isDirectory()) {
174
+ throw new Error(`Expected a directory: ${current}`);
175
+ }
176
+ if (index === parts.length - 1 && !info.isFile()) {
177
+ throw new Error(`Expected a regular file: ${current}`);
178
+ }
179
+ }
180
+ }
181
+
182
+ function materializeFiles(product, agent) {
183
+ const result = {};
184
+ const agentSkill = `${AGENT_PATHS[agent]}/skills/bidtry-design-improve`;
185
+ for (const [name, file] of Object.entries(product.files)) {
186
+ assertRelative(name);
187
+ if (
188
+ typeof file?.content !== 'string' ||
189
+ ![0o644, 0o755].includes(file.mode)
190
+ ) {
191
+ throw new Error(`Invalid packaged skill file: ${product.slug}/${name}`);
192
+ }
193
+ let contents = file.content;
194
+ if (product.slug === 'design-improve') {
195
+ contents = contents.replaceAll(
196
+ '.agents/skills/bidtry-design-improve',
197
+ agentSkill
198
+ );
199
+ if (agent !== 'codex' && agent !== 'project') {
200
+ contents = contents.replaceAll(
201
+ '$bidtry-design-improve',
202
+ '/bidtry-design-improve'
203
+ );
204
+ }
205
+ }
206
+ result[name] = { contents, mode: file.mode };
207
+ }
208
+ if (agent === 'project') {
209
+ result['START-HERE.md'] = {
210
+ contents: `# ${product.title}\n\nThese are project-local workflow files. Open SKILL.md in any editor, follow the workflow yourself, or give the instructions to your coding assistant. No particular assistant is required to store or read these files.\n\nThe skill's dollar-sign and slash examples are requests for compatible assistants, not shell commands. This installation does not install a standalone application, native engine, or project dependencies.\n\nTool: https://bidtry.com/${product.slug}\n`,
211
+ mode: 0o644
212
+ };
213
+ }
214
+ return result;
215
+ }
216
+
217
+ function readManifest(root, relative, productName, isRequired = false) {
218
+ assertRegularPath(root, relative);
219
+ const absolute = path.join(root, relative);
220
+ if (!existsSync(absolute)) {
221
+ if (isRequired) throw new Error(`Bidtry installation not found: ${absolute}`);
222
+ return null;
223
+ }
224
+ let manifest;
225
+ try {
226
+ manifest = JSON.parse(readFileSync(absolute, 'utf8'));
227
+ } catch {
228
+ throw new Error(`Invalid installer manifest: ${absolute}`);
229
+ }
230
+ if (
231
+ manifest?.schemaVersion !== 1 ||
232
+ manifest?.package !== productName ||
233
+ !manifest.files ||
234
+ typeof manifest.files !== 'object'
235
+ ) {
236
+ throw new Error(`Unrecognized installer manifest: ${absolute}`);
237
+ }
238
+ return manifest;
239
+ }
240
+
241
+ /** Validate every requested destination before any file changes. */
242
+ export function createInstallPlan(selected, options) {
243
+ const root = realpathSync(options.target);
244
+ if (!lstatSync(root).isDirectory()) {
245
+ throw new Error(`Target is not a directory: ${root}`);
246
+ }
247
+ const files = [];
248
+ for (const product of selected) {
249
+ if (!/^bidtry-[a-z0-9]+(?:-[a-z0-9]+)*$/.test(product.name)) {
250
+ throw new Error(`Invalid Bidtry package name: ${product.name}`);
251
+ }
252
+ for (const agent of options.agents) {
253
+ const skillDirectory = path.join(
254
+ AGENT_PATHS[agent],
255
+ 'skills',
256
+ product.name
257
+ );
258
+ const manifestRelative = path.join(skillDirectory, MANIFEST);
259
+ const previousManifest = readManifest(
260
+ root,
261
+ manifestRelative,
262
+ product.name
263
+ );
264
+ const payload = materializeFiles(product, agent);
265
+ const hashes = {};
266
+ for (const [name, file] of Object.entries(payload)) {
267
+ const relative = path.join(skillDirectory, name);
268
+ assertRegularPath(root, relative);
269
+ const destination = path.join(root, relative);
270
+ const previous = existsSync(destination)
271
+ ? readFileSync(destination, 'utf8')
272
+ : null;
273
+ if (
274
+ previous !== null &&
275
+ previous !== file.contents &&
276
+ previousManifest?.files?.[name] !== digest(previous)
277
+ ) {
278
+ throw new Error(
279
+ `Preserving your existing file: ${destination}. Move or rename this skill folder before installing.`
280
+ );
281
+ }
282
+ hashes[name] = digest(file.contents);
283
+ files.push({
284
+ path: destination,
285
+ relative,
286
+ contents: file.contents,
287
+ previous,
288
+ mode: file.mode
289
+ });
290
+ }
291
+ const manifestContents =
292
+ JSON.stringify(
293
+ {
294
+ schemaVersion: 1,
295
+ package: product.name,
296
+ version: product.version,
297
+ installedBy: `bidtry-tools-installer@${INSTALLER_VERSION}`,
298
+ files: hashes
299
+ },
300
+ null,
301
+ 2
302
+ ) + '\n';
303
+ const manifestPath = path.join(root, manifestRelative);
304
+ files.push({
305
+ path: manifestPath,
306
+ relative: manifestRelative,
307
+ contents: manifestContents,
308
+ previous: existsSync(manifestPath)
309
+ ? readFileSync(manifestPath, 'utf8')
310
+ : null,
311
+ mode: 0o644
312
+ });
313
+ }
314
+ }
315
+ return { root, files, skills: selected.length * options.agents.length };
316
+ }
317
+
318
+ function applyInstallPlan(plan) {
319
+ let changed = 0;
320
+ for (const file of plan.files) {
321
+ assertRegularPath(plan.root, file.relative);
322
+ const current = existsSync(file.path)
323
+ ? readFileSync(file.path, 'utf8')
324
+ : null;
325
+ if (current !== file.previous) {
326
+ throw new Error(`File changed during installation: ${file.path}`);
327
+ }
328
+ const currentMode = existsSync(file.path) ? lstatSync(file.path).mode & 0o777 : null;
329
+ if (current === file.contents && currentMode === file.mode) continue;
330
+ mkdirSync(path.dirname(file.path), { recursive: true });
331
+ if (current !== file.contents) {
332
+ const temporary = `${file.path}.${randomUUID()}.tmp`;
333
+ try {
334
+ writeFileSync(temporary, file.contents, {
335
+ flag: 'wx',
336
+ mode: file.mode
337
+ });
338
+ renameSync(temporary, file.path);
339
+ } finally {
340
+ if (existsSync(temporary)) unlinkSync(temporary);
341
+ }
342
+ }
343
+ chmodSync(file.path, file.mode);
344
+ changed += 1;
345
+ }
346
+ return changed;
347
+ }
348
+
349
+ function createVerification(selected, options) {
350
+ const root = realpathSync(options.target);
351
+ const failures = [];
352
+ let skills = 0;
353
+ for (const product of selected) {
354
+ for (const agent of options.agents) {
355
+ const skillDirectory = path.join(
356
+ AGENT_PATHS[agent],
357
+ 'skills',
358
+ product.name
359
+ );
360
+ const manifestRelative = path.join(skillDirectory, MANIFEST);
361
+ const manifest = readManifest(root, manifestRelative, product.name, true);
362
+ const payload = materializeFiles(product, agent);
363
+ for (const [name, file] of Object.entries(payload)) {
364
+ const relative = path.join(skillDirectory, name);
365
+ try {
366
+ assertRegularPath(root, relative);
367
+ const absolute = path.join(root, relative);
368
+ if (!existsSync(absolute)) throw new Error('file is missing');
369
+ const actual = digest(readFileSync(absolute));
370
+ if (actual !== digest(file.contents)) throw new Error('file is outdated or edited');
371
+ if (manifest.files[name] !== actual) throw new Error('manifest hash does not match');
372
+ } catch (error) {
373
+ failures.push(`${relative}: ${error.message}`);
374
+ }
375
+ }
376
+ skills += 1;
377
+ }
378
+ }
379
+ if (failures.length) {
380
+ throw new Error(`Verification failed:\n${failures.map(item => ` ${item}`).join('\n')}`);
381
+ }
382
+ return { root, skills };
383
+ }
384
+
385
+ function createUninstallPlan(selected, options) {
386
+ const root = realpathSync(options.target);
387
+ const files = [];
388
+ const directories = new Set();
389
+ for (const product of selected) {
390
+ for (const agent of options.agents) {
391
+ const skillDirectory = path.join(
392
+ AGENT_PATHS[agent],
393
+ 'skills',
394
+ product.name
395
+ );
396
+ const manifestRelative = path.join(skillDirectory, MANIFEST);
397
+ const manifest = readManifest(root, manifestRelative, product.name, true);
398
+ for (const [name, expected] of Object.entries(manifest.files)) {
399
+ assertRelative(name);
400
+ if (!/^[a-f0-9]{64}$/.test(expected)) {
401
+ throw new Error(`Invalid managed-file hash: ${manifestRelative}`);
402
+ }
403
+ const relative = path.join(skillDirectory, name);
404
+ assertRegularPath(root, relative);
405
+ const absolute = path.join(root, relative);
406
+ if (!existsSync(absolute)) {
407
+ throw new Error(`Managed file is missing: ${absolute}`);
408
+ }
409
+ if (digest(readFileSync(absolute)) !== expected) {
410
+ throw new Error(`Preserving your edited file: ${absolute}`);
411
+ }
412
+ files.push({ path: absolute, relative });
413
+ let directory = path.dirname(absolute);
414
+ const skillRoot = path.join(root, skillDirectory);
415
+ while (directory.startsWith(skillRoot)) {
416
+ directories.add(directory);
417
+ if (directory === skillRoot) break;
418
+ directory = path.dirname(directory);
419
+ }
420
+ }
421
+ files.push({
422
+ path: path.join(root, manifestRelative),
423
+ relative: manifestRelative
424
+ });
425
+ }
426
+ }
427
+ return {
428
+ root,
429
+ files,
430
+ directories: [...directories].sort((a, b) => b.length - a.length),
431
+ skills: selected.length * options.agents.length
432
+ };
433
+ }
434
+
435
+ function applyUninstallPlan(plan) {
436
+ for (const file of plan.files) {
437
+ assertRegularPath(plan.root, file.relative);
438
+ if (existsSync(file.path)) unlinkSync(file.path);
439
+ }
440
+ for (const directory of plan.directories) {
441
+ if (existsSync(directory) && readdirSync(directory).length === 0) {
442
+ rmdirSync(directory);
443
+ }
444
+ }
445
+ }
446
+
447
+ function help() {
448
+ return `Bidtry Tools Installer ${INSTALLER_VERSION}\n\nUsage:\n node bidtry-install.mjs list\n node bidtry-install.mjs install --tool SLUG [options]\n node bidtry-install.mjs install --tools SLUG,SLUG [options]\n node bidtry-install.mjs install --preset design|all [options]\n node bidtry-install.mjs verify --tool|--tools|--preset VALUE [options]\n node bidtry-install.mjs uninstall --tool|--tools|--preset VALUE [options]\n\nOptions:\n --agent project|codex|claude|cursor|all Default: codex\n --target PATH Default: current directory\n --dry-run Show changes without writing\n\nThe installer adds project-local agent skills only, or editor-readable workflow files with --agent project. It does not change application code, install dependencies, configure credentials, or install native engines.\n`;
449
+ }
450
+
451
+ /** Run a complete installer command. */
452
+ export function runCli(args, cwd) {
453
+ const options = parseArguments(args, cwd);
454
+ if (options.command === 'help') return help();
455
+ if (options.command === 'version') return `bidtry-tools-installer ${INSTALLER_VERSION}\n`;
456
+ if (options.command === 'list') {
457
+ return `${[...productMap().values()]
458
+ .sort((a, b) => a.title.localeCompare(b.title))
459
+ .map(product => `${product.slug}\t${product.title}`)
460
+ .join('\n')}\n`;
461
+ }
462
+ const selected = selectProducts(options.selector);
463
+ if (options.command === 'install') {
464
+ const plan = createInstallPlan(selected, options);
465
+ if (options.dryRun) {
466
+ return `Dry run — no files written (${plan.skills} skills):\n${plan.files
467
+ .map(file => ` ${file.path}`)
468
+ .join('\n')}\n`;
469
+ }
470
+ const changed = applyInstallPlan(plan);
471
+ const first = selected[0].name;
472
+ if (options.agents.includes('project')) {
473
+ return `${changed ? 'Installed or updated' : 'Already current:'} ${plan.skills} Bidtry workflow${plan.skills === 1 ? '' : 's'} in ${plan.root}.\nOpen .bidtry/skills/${first}/START-HERE.md in your editor.\nWorkflow files only; native engines and project dependencies remain separate.\n`;
474
+ }
475
+ const invocation = options.agents.includes('codex') ? `$${first} init` : `/${first} init`;
476
+ return `${changed ? 'Installed or updated' : 'Already current:'} ${plan.skills} Bidtry skill${plan.skills === 1 ? '' : 's'} in ${plan.root}.\nReload your coding agent, then start with ${invocation} inside the agent.\nApplication code and dependencies were not changed. Native engines remain separate.\n`;
477
+ }
478
+ if (options.command === 'verify') {
479
+ const result = createVerification(selected, options);
480
+ return `Verified ${result.skills} current Bidtry skill${result.skills === 1 ? '' : 's'} in ${result.root}.\n`;
481
+ }
482
+ const plan = createUninstallPlan(selected, options);
483
+ if (options.dryRun) {
484
+ return `Dry run — no files removed (${plan.skills} skills):\n${plan.files
485
+ .map(file => ` ${file.path}`)
486
+ .join('\n')}\n`;
487
+ }
488
+ applyUninstallPlan(plan);
489
+ return `Removed ${plan.skills} managed Bidtry skill${plan.skills === 1 ? '' : 's'} from ${plan.root}. Unrelated files were preserved.\n`;
490
+ }
491
+
492
+ if (
493
+ process.argv[1] &&
494
+ import.meta.url === pathToFileURL(realpathSync(process.argv[1])).href
495
+ ) {
496
+ try {
497
+ process.stdout.write(runCli(process.argv.slice(2), process.cwd()));
498
+ } catch (error) {
499
+ process.stderr.write(`${error.message}\n`);
500
+ process.exitCode = 1;
501
+ }
502
+ }
package/package.json CHANGED
@@ -1,6 +1,40 @@
1
1
  {
2
2
  "name": "bidtry-accessibility-improve",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.1",
4
+ "description": "Bidtry Accessibility Improve: install project-local workflow instructions. Native engines are separate.",
5
+ "type": "module",
6
+ "license": "SEE LICENSE IN BIDTRY_TEAM_SOURCE.txt",
7
+ "author": {
8
+ "name": "Bidtry",
9
+ "url": "https://bidtry.com"
10
+ },
11
+ "contributors": [
12
+ {
13
+ "name": "Keshab Amgain"
14
+ }
15
+ ],
16
+ "homepage": "https://bidtry.com/accessibility-improve",
17
+ "engines": {
18
+ "node": ">=20"
19
+ },
20
+ "bin": {
21
+ "bidtry-accessibility-improve": "bin/cli.mjs"
22
+ },
23
+ "files": [
24
+ "bin/cli.mjs",
25
+ "lib/runtime.mjs",
26
+ "README.md",
27
+ "BIDTRY_TEAM_SOURCE.txt",
28
+ "SOURCE.json"
29
+ ],
30
+ "publishConfig": {
31
+ "access": "public",
32
+ "registry": "https://registry.npmjs.org/"
33
+ },
34
+ "keywords": [
35
+ "bidtry",
36
+ "developer-tools",
37
+ "project-workflow",
38
+ "accessibility-improve"
39
+ ]
40
+ }