prpm 1.2.1 → 2.0.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.
Files changed (67) hide show
  1. package/README.md +90 -862
  2. package/dist/index.js +23233 -65
  3. package/dist/schemas/agents-md.schema.json +24 -0
  4. package/dist/schemas/aider.schema.json +24 -0
  5. package/dist/schemas/canonical.schema.json +435 -0
  6. package/dist/schemas/claude-agent.schema.json +62 -0
  7. package/dist/schemas/claude-hook.schema.json +70 -0
  8. package/dist/schemas/claude-plugin.schema.json +122 -0
  9. package/dist/schemas/claude-skill.schema.json +51 -0
  10. package/dist/schemas/claude-slash-command.schema.json +77 -0
  11. package/dist/schemas/claude.schema.json +52 -0
  12. package/dist/schemas/continue.schema.json +98 -0
  13. package/dist/schemas/copilot.schema.json +76 -0
  14. package/dist/schemas/cursor-command.schema.json +27 -0
  15. package/dist/schemas/cursor-hooks.schema.json +59 -0
  16. package/dist/schemas/cursor.schema.json +74 -0
  17. package/dist/schemas/droid-hook.schema.json +103 -0
  18. package/dist/schemas/droid-skill.schema.json +46 -0
  19. package/dist/schemas/droid-slash-command.schema.json +53 -0
  20. package/dist/schemas/droid.schema.json +46 -0
  21. package/dist/schemas/format-registry.schema.json +99 -0
  22. package/dist/schemas/gemini-md.schema.json +24 -0
  23. package/dist/schemas/gemini.schema.json +30 -0
  24. package/dist/schemas/kiro-agent.schema.json +146 -0
  25. package/dist/schemas/kiro-hook.schema.json +120 -0
  26. package/dist/schemas/kiro-steering.schema.json +74 -0
  27. package/dist/schemas/mcp-server.schema.json +130 -0
  28. package/dist/schemas/opencode-slash-command.schema.json +60 -0
  29. package/dist/schemas/opencode.schema.json +111 -0
  30. package/dist/schemas/prpm-manifest.schema.json +733 -0
  31. package/dist/schemas/replit.schema.json +21 -0
  32. package/dist/schemas/ruler.schema.json +22 -0
  33. package/dist/schemas/trae.schema.json +24 -0
  34. package/dist/schemas/windsurf.schema.json +22 -0
  35. package/dist/schemas/zencoder.schema.json +51 -0
  36. package/package.json +20 -14
  37. package/schemas/prpm-manifest.schema.json +465 -39
  38. package/dist/__tests__/e2e/test-helpers.js +0 -150
  39. package/dist/commands/collections.js +0 -606
  40. package/dist/commands/index.js +0 -186
  41. package/dist/commands/info.js +0 -82
  42. package/dist/commands/install.js +0 -477
  43. package/dist/commands/list.js +0 -166
  44. package/dist/commands/login.js +0 -281
  45. package/dist/commands/outdated.js +0 -128
  46. package/dist/commands/popular.js +0 -27
  47. package/dist/commands/publish.js +0 -274
  48. package/dist/commands/schema.js +0 -37
  49. package/dist/commands/search.js +0 -404
  50. package/dist/commands/telemetry.js +0 -103
  51. package/dist/commands/trending.js +0 -76
  52. package/dist/commands/uninstall.js +0 -77
  53. package/dist/commands/update.js +0 -121
  54. package/dist/commands/upgrade.js +0 -121
  55. package/dist/commands/whoami.js +0 -75
  56. package/dist/core/claude-config.js +0 -91
  57. package/dist/core/cursor-config.js +0 -130
  58. package/dist/core/downloader.js +0 -64
  59. package/dist/core/filesystem.js +0 -124
  60. package/dist/core/lockfile.js +0 -239
  61. package/dist/core/marketplace-converter.js +0 -198
  62. package/dist/core/registry-client.js +0 -265
  63. package/dist/core/schema-validator.js +0 -74
  64. package/dist/core/telemetry.js +0 -175
  65. package/dist/core/user-config.js +0 -79
  66. package/dist/types/registry.js +0 -5
  67. package/dist/types.js +0 -5
@@ -4,7 +4,12 @@
4
4
  "title": "PRPM Package Manifest",
5
5
  "description": "Schema for PRPM package manifest (prpm.json)",
6
6
  "type": "object",
7
- "required": ["name", "version", "description", "type"],
7
+ "required": [
8
+ "name",
9
+ "version",
10
+ "description",
11
+ "format"
12
+ ],
8
13
  "properties": {
9
14
  "name": {
10
15
  "type": "string",
@@ -22,7 +27,11 @@
22
27
  "type": "string",
23
28
  "description": "Semantic version (semver)",
24
29
  "pattern": "^\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9.-]+)?(\\+[a-zA-Z0-9.-]+)?$",
25
- "examples": ["1.0.0", "2.1.3", "1.0.0-beta.1"]
30
+ "examples": [
31
+ "1.0.0",
32
+ "2.1.3",
33
+ "1.0.0-beta.1"
34
+ ]
26
35
  },
27
36
  "description": {
28
37
  "type": "string",
@@ -30,19 +39,39 @@
30
39
  "minLength": 10,
31
40
  "maxLength": 500
32
41
  },
33
- "type": {
42
+ "format": {
34
43
  "type": "string",
35
- "description": "Package type. Use 'collection' only if files contain multiple distinct types.",
44
+ "description": "Package format - the AI tool/platform this package is for",
36
45
  "enum": [
37
46
  "cursor",
38
47
  "claude",
39
- "claude-skill",
40
- "claude-agent",
41
- "claude-slash-command",
48
+ "claude-plugin",
42
49
  "continue",
43
50
  "windsurf",
51
+ "copilot",
52
+ "kiro",
53
+ "agents.md",
44
54
  "generic",
45
- "collection"
55
+ "mcp"
56
+ ]
57
+ },
58
+ "subtype": {
59
+ "type": "string",
60
+ "description": "Package subtype - the functional category (optional, defaults to 'rule')",
61
+ "enum": [
62
+ "rule",
63
+ "agent",
64
+ "skill",
65
+ "slash-command",
66
+ "prompt",
67
+ "workflow",
68
+ "tool",
69
+ "template",
70
+ "collection",
71
+ "chatmode",
72
+ "hook",
73
+ "plugin",
74
+ "server"
46
75
  ]
47
76
  },
48
77
  "author": {
@@ -50,11 +79,16 @@
50
79
  "oneOf": [
51
80
  {
52
81
  "type": "string",
53
- "examples": ["John Doe", "Jane Smith"]
82
+ "examples": [
83
+ "John Doe",
84
+ "Jane Smith"
85
+ ]
54
86
  },
55
87
  {
56
88
  "type": "object",
57
- "required": ["name"],
89
+ "required": [
90
+ "name"
91
+ ],
58
92
  "properties": {
59
93
  "name": {
60
94
  "type": "string",
@@ -77,13 +111,29 @@
77
111
  "license": {
78
112
  "type": "string",
79
113
  "description": "SPDX license identifier",
80
- "examples": ["MIT", "Apache-2.0", "GPL-3.0", "BSD-3-Clause"]
114
+ "examples": [
115
+ "MIT",
116
+ "Apache-2.0",
117
+ "GPL-3.0",
118
+ "BSD-3-Clause"
119
+ ]
120
+ },
121
+ "license_text": {
122
+ "type": "string",
123
+ "description": "Full text of the license file for proper attribution"
124
+ },
125
+ "license_url": {
126
+ "type": "string",
127
+ "format": "uri",
128
+ "description": "URL to the license file in the repository"
81
129
  },
82
130
  "repository": {
83
131
  "type": "string",
84
132
  "format": "uri",
85
133
  "description": "Repository URL",
86
- "examples": ["https://github.com/username/repo"]
134
+ "examples": [
135
+ "https://github.com/username/repo"
136
+ ]
87
137
  },
88
138
  "homepage": {
89
139
  "type": "string",
@@ -95,6 +145,42 @@
95
145
  "format": "uri",
96
146
  "description": "Documentation URL"
97
147
  },
148
+ "organization": {
149
+ "type": "string",
150
+ "description": "Organization name or ID to publish this package under. If not specified, publishes to personal account.",
151
+ "examples": [
152
+ "my-team",
153
+ "my-company"
154
+ ]
155
+ },
156
+ "private": {
157
+ "type": "boolean",
158
+ "description": "Whether the package is private. Private packages are only accessible to the owner/organization members. Defaults to false (public).",
159
+ "default": false
160
+ },
161
+ "scripts": {
162
+ "type": "object",
163
+ "description": "Lifecycle scripts that run during package operations. Only applies to multi-package manifests (prpm.json with packages array).",
164
+ "properties": {
165
+ "prepublishOnly": {
166
+ "type": "string",
167
+ "description": "Script to run before publishing (recommended - only runs on 'prpm publish')",
168
+ "examples": [
169
+ "npm run build",
170
+ "cd packages/hooks && npm run build",
171
+ "npm test && npm run build"
172
+ ]
173
+ },
174
+ "prepublish": {
175
+ "type": "string",
176
+ "description": "Script to run before publishing and on npm install (not recommended - use prepublishOnly instead)",
177
+ "examples": [
178
+ "npm run build"
179
+ ]
180
+ }
181
+ },
182
+ "additionalProperties": false
183
+ },
98
184
  "tags": {
99
185
  "type": "array",
100
186
  "description": "Package tags for categorization",
@@ -103,7 +189,16 @@
103
189
  },
104
190
  "maxItems": 10,
105
191
  "uniqueItems": true,
106
- "examples": [["productivity", "coding"], ["testing", "quality"]]
192
+ "examples": [
193
+ [
194
+ "productivity",
195
+ "coding"
196
+ ],
197
+ [
198
+ "testing",
199
+ "quality"
200
+ ]
201
+ ]
107
202
  },
108
203
  "keywords": {
109
204
  "type": "array",
@@ -113,12 +208,22 @@
113
208
  },
114
209
  "maxItems": 20,
115
210
  "uniqueItems": true,
116
- "examples": [["ai", "prompts", "development"]]
211
+ "examples": [
212
+ [
213
+ "ai",
214
+ "prompts",
215
+ "development"
216
+ ]
217
+ ]
117
218
  },
118
219
  "category": {
119
220
  "type": "string",
120
221
  "description": "Package category",
121
- "examples": ["development", "productivity", "testing"]
222
+ "examples": [
223
+ "development",
224
+ "productivity",
225
+ "testing"
226
+ ]
122
227
  },
123
228
  "files": {
124
229
  "description": "Files to include in package. Can be simple paths or enhanced file objects with metadata.",
@@ -131,8 +236,14 @@
131
236
  },
132
237
  "minItems": 1,
133
238
  "examples": [
134
- ["skill.md", "README.md"],
135
- [".cursor/rules/react.mdc", "LICENSE"]
239
+ [
240
+ "skill.md",
241
+ "README.md"
242
+ ],
243
+ [
244
+ ".cursor/rules/react.mdc",
245
+ "LICENSE"
246
+ ]
136
247
  ]
137
248
  },
138
249
  {
@@ -140,7 +251,10 @@
140
251
  "description": "Enhanced format: array of file objects with metadata",
141
252
  "items": {
142
253
  "type": "object",
143
- "required": ["path", "type"],
254
+ "required": [
255
+ "path",
256
+ "format"
257
+ ],
144
258
  "properties": {
145
259
  "path": {
146
260
  "type": "string",
@@ -151,24 +265,48 @@
151
265
  ".continue/rules/python.json"
152
266
  ]
153
267
  },
154
- "type": {
268
+ "format": {
155
269
  "type": "string",
156
- "description": "File type (determines where it will be installed)",
270
+ "description": "File format - the AI tool/platform this file is for",
157
271
  "enum": [
158
272
  "cursor",
159
273
  "claude",
160
- "claude-skill",
161
- "claude-agent",
162
- "claude-slash-command",
274
+ "claude-plugin",
163
275
  "continue",
164
276
  "windsurf",
165
- "generic"
277
+ "copilot",
278
+ "kiro",
279
+ "agents.md",
280
+ "generic",
281
+ "mcp"
282
+ ]
283
+ },
284
+ "subtype": {
285
+ "type": "string",
286
+ "description": "File subtype - the functional category",
287
+ "enum": [
288
+ "rule",
289
+ "agent",
290
+ "skill",
291
+ "slash-command",
292
+ "prompt",
293
+ "workflow",
294
+ "tool",
295
+ "template",
296
+ "collection",
297
+ "chatmode",
298
+ "hook",
299
+ "plugin",
300
+ "server"
166
301
  ]
167
302
  },
168
303
  "name": {
169
304
  "type": "string",
170
305
  "description": "Display name for this file",
171
- "examples": ["React Rules", "Test-Driven Development"]
306
+ "examples": [
307
+ "React Rules",
308
+ "Test-Driven Development"
309
+ ]
172
310
  },
173
311
  "description": {
174
312
  "type": "string",
@@ -181,7 +319,16 @@
181
319
  "type": "string"
182
320
  },
183
321
  "uniqueItems": true,
184
- "examples": [["react", "typescript"], ["testing", "tdd"]]
322
+ "examples": [
323
+ [
324
+ "react",
325
+ "typescript"
326
+ ],
327
+ [
328
+ "testing",
329
+ "tdd"
330
+ ]
331
+ ]
185
332
  }
186
333
  },
187
334
  "additionalProperties": false
@@ -193,7 +340,10 @@
193
340
  "main": {
194
341
  "type": "string",
195
342
  "description": "Main entry file (for single-file packages)",
196
- "examples": ["index.md", "skill.md"]
343
+ "examples": [
344
+ "index.md",
345
+ "skill.md"
346
+ ]
197
347
  },
198
348
  "dependencies": {
199
349
  "type": "object",
@@ -242,6 +392,108 @@
242
392
  "node": ">=18.0.0"
243
393
  }
244
394
  ]
395
+ },
396
+ "packages": {
397
+ "type": "array",
398
+ "description": "Array of packages to publish from a single manifest (multi-package publishing). Packages inherit top-level fields unless overridden.",
399
+ "items": {
400
+ "$ref": "#"
401
+ },
402
+ "minItems": 1
403
+ },
404
+ "collections": {
405
+ "type": "array",
406
+ "description": "Array of collections to publish. Collections bundle multiple packages together for easier installation.",
407
+ "items": {
408
+ "type": "object",
409
+ "required": ["id", "name", "description", "packages"],
410
+ "properties": {
411
+ "id": {
412
+ "type": "string",
413
+ "description": "Unique collection identifier (kebab-case)",
414
+ "pattern": "^[a-z0-9-]+$",
415
+ "minLength": 3,
416
+ "maxLength": 100,
417
+ "examples": ["nextjs-complete", "fullstack-setup", "react-essentials"]
418
+ },
419
+ "name": {
420
+ "type": "string",
421
+ "description": "Display name of the collection",
422
+ "minLength": 3,
423
+ "maxLength": 100,
424
+ "examples": ["Next.js Complete", "Full Stack Setup"]
425
+ },
426
+ "description": {
427
+ "type": "string",
428
+ "description": "What this collection provides",
429
+ "minLength": 10,
430
+ "maxLength": 500
431
+ },
432
+ "version": {
433
+ "type": "string",
434
+ "description": "Semantic version of the collection",
435
+ "pattern": "^\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9.-]+)?(\\+[a-zA-Z0-9.-]+)?$",
436
+ "examples": ["1.0.0", "2.1.0"]
437
+ },
438
+ "category": {
439
+ "type": "string",
440
+ "description": "Collection category",
441
+ "enum": ["development", "testing", "deployment", "data-science", "devops", "design", "documentation", "security", "performance", "general"],
442
+ "examples": ["development", "testing"]
443
+ },
444
+ "tags": {
445
+ "type": "array",
446
+ "description": "Tags for discoverability (kebab-case)",
447
+ "items": {
448
+ "type": "string",
449
+ "pattern": "^[a-z0-9-]+$"
450
+ },
451
+ "minItems": 1,
452
+ "maxItems": 10,
453
+ "examples": [["react", "typescript", "nextjs"], ["python", "data-science", "ml"]]
454
+ },
455
+ "icon": {
456
+ "type": "string",
457
+ "description": "Emoji or icon for the collection",
458
+ "maxLength": 10,
459
+ "examples": ["⚛️", "🚀", "📦"]
460
+ },
461
+ "packages": {
462
+ "type": "array",
463
+ "description": "Array of packages included in this collection",
464
+ "items": {
465
+ "type": "object",
466
+ "required": ["packageId"],
467
+ "properties": {
468
+ "packageId": {
469
+ "type": "string",
470
+ "description": "Package identifier to include",
471
+ "minLength": 1,
472
+ "examples": ["typescript-strict", "react-best-practices"]
473
+ },
474
+ "version": {
475
+ "type": "string",
476
+ "description": "Version range (semver) or 'latest'",
477
+ "examples": ["^1.0.0", "~2.1.0", "1.0.0", "latest"]
478
+ },
479
+ "required": {
480
+ "type": "boolean",
481
+ "description": "Whether this package is required (true) or optional (false)",
482
+ "default": true
483
+ },
484
+ "reason": {
485
+ "type": "string",
486
+ "description": "Explanation of why this package is included",
487
+ "maxLength": 200,
488
+ "examples": ["Enforces strict TypeScript type safety", "React component best practices"]
489
+ }
490
+ }
491
+ },
492
+ "minItems": 1
493
+ }
494
+ }
495
+ },
496
+ "minItems": 1
245
497
  }
246
498
  },
247
499
  "additionalProperties": false,
@@ -250,35 +502,61 @@
250
502
  "name": "@username/simple-package",
251
503
  "version": "1.0.0",
252
504
  "description": "A simple package with basic files",
253
- "type": "claude-skill",
505
+ "format": "claude", "subtype": "skill",
254
506
  "author": "Your Name",
255
507
  "license": "MIT",
256
- "files": ["skill.md", "README.md"]
508
+ "files": [
509
+ "skill.md",
510
+ "README.md"
511
+ ]
512
+ },
513
+ {
514
+ "name": "@company/team-package",
515
+ "version": "1.0.0",
516
+ "description": "A package published under organization account",
517
+ "format": "cursor",
518
+ "author": "Team Name",
519
+ "organization": "my-company",
520
+ "license": "MIT",
521
+ "files": [
522
+ ".cursor/rules/guidelines.mdc",
523
+ "README.md"
524
+ ]
257
525
  },
258
526
  {
259
527
  "name": "@username/cursor-rules",
260
528
  "version": "1.0.0",
261
529
  "description": "Multiple Cursor rules for different languages",
262
- "type": "cursor",
530
+ "format": "cursor",
263
531
  "author": {
264
532
  "name": "Your Name",
265
533
  "email": "you@example.com"
266
534
  },
267
535
  "license": "MIT",
268
536
  "repository": "https://github.com/username/cursor-rules",
269
- "tags": ["cursor", "rules", "multi-language"],
537
+ "tags": [
538
+ "cursor",
539
+ "rules",
540
+ "multi-language"
541
+ ],
270
542
  "files": [
271
543
  {
272
544
  "path": ".cursor/rules/typescript.mdc",
273
- "type": "cursor",
545
+ "format": "cursor",
274
546
  "name": "TypeScript Rules",
275
- "tags": ["typescript", "frontend"]
547
+ "tags": [
548
+ "typescript",
549
+ "frontend"
550
+ ]
276
551
  },
277
552
  {
278
553
  "path": ".cursor/rules/python.mdc",
279
- "type": "cursor",
554
+ "format": "cursor",
280
555
  "name": "Python Rules",
281
- "tags": ["python", "backend"]
556
+ "tags": [
557
+ "python",
558
+ "backend"
559
+ ]
282
560
  }
283
561
  ]
284
562
  },
@@ -286,22 +564,170 @@
286
564
  "name": "@community/testing-suite",
287
565
  "version": "2.0.0",
288
566
  "description": "Complete testing suite with skills and agents",
289
- "type": "collection",
567
+ "format": "generic", "subtype": "collection",
290
568
  "author": "Community",
291
569
  "license": "MIT",
292
- "tags": ["testing", "quality"],
570
+ "tags": [
571
+ "testing",
572
+ "quality"
573
+ ],
293
574
  "files": [
294
575
  {
295
576
  "path": ".claude/skills/tdd.md",
296
- "type": "claude-skill",
577
+ "format": "claude", "subtype": "skill",
297
578
  "name": "Test-Driven Development"
298
579
  },
299
580
  {
300
581
  "path": ".claude/agents/test-generator.md",
301
- "type": "claude-agent",
582
+ "format": "claude", "subtype": "agent",
302
583
  "name": "Test Generator"
303
584
  }
304
585
  ]
586
+ },
587
+ {
588
+ "name": "@username/copilot-instructions",
589
+ "version": "1.0.0",
590
+ "description": "GitHub Copilot instructions for API development",
591
+ "format": "copilot",
592
+ "author": "Your Name",
593
+ "license": "MIT",
594
+ "tags": [
595
+ "copilot",
596
+ "api",
597
+ "backend"
598
+ ],
599
+ "files": [
600
+ "api-guidelines.md"
601
+ ]
602
+ },
603
+ {
604
+ "name": "@username/kiro-steering",
605
+ "version": "1.0.0",
606
+ "description": "Kiro steering file for testing standards",
607
+ "format": "kiro",
608
+ "author": "Your Name",
609
+ "license": "MIT",
610
+ "tags": [
611
+ "kiro",
612
+ "testing",
613
+ "quality"
614
+ ],
615
+ "files": [
616
+ "testing.md"
617
+ ]
618
+ },
619
+ {
620
+ "name": "@username/windsurf-rules",
621
+ "version": "1.0.0",
622
+ "description": "Windsurf coding rules for React projects",
623
+ "format": "windsurf",
624
+ "author": "Your Name",
625
+ "license": "MIT",
626
+ "tags": [
627
+ "windsurf",
628
+ "react",
629
+ "frontend"
630
+ ],
631
+ "files": [
632
+ ".windsurfrules"
633
+ ]
634
+ },
635
+ {
636
+ "name": "@company/private-package",
637
+ "version": "1.0.0",
638
+ "description": "A private package only accessible to organization members",
639
+ "format": "claude",
640
+ "subtype": "skill",
641
+ "author": "Company Team",
642
+ "organization": "my-company",
643
+ "private": true,
644
+ "license": "Proprietary",
645
+ "files": [
646
+ "internal-skill.md",
647
+ "README.md"
648
+ ]
649
+ },
650
+ {
651
+ "name": "@username/multi-package-example",
652
+ "version": "1.0.0",
653
+ "description": "Multi-package manifest example",
654
+ "author": "Your Name",
655
+ "license": "MIT",
656
+ "repository": "https://github.com/username/multi-package",
657
+ "packages": [
658
+ {
659
+ "name": "@username/package-one",
660
+ "version": "1.0.0",
661
+ "description": "First package in the multi-package manifest",
662
+ "format": "claude",
663
+ "subtype": "skill",
664
+ "files": [
665
+ "package-one/SKILL.md"
666
+ ]
667
+ },
668
+ {
669
+ "name": "@username/package-two",
670
+ "version": "1.0.0",
671
+ "description": "Second package with different settings",
672
+ "format": "cursor",
673
+ "private": true,
674
+ "files": [
675
+ "package-two/.cursor/rules/main.mdc"
676
+ ]
677
+ }
678
+ ]
679
+ },
680
+ {
681
+ "name": "@username/multi-package-with-collection",
682
+ "version": "1.0.0",
683
+ "description": "Repository with both packages and a collection",
684
+ "author": "Your Name",
685
+ "license": "MIT",
686
+ "packages": [
687
+ {
688
+ "name": "typescript-rules",
689
+ "version": "1.0.0",
690
+ "description": "TypeScript coding standards",
691
+ "format": "cursor",
692
+ "subtype": "rule",
693
+ "tags": ["typescript", "cursor"],
694
+ "files": [".cursor/rules/typescript.mdc"]
695
+ },
696
+ {
697
+ "name": "react-patterns",
698
+ "version": "1.0.0",
699
+ "description": "React best practices",
700
+ "format": "claude",
701
+ "subtype": "skill",
702
+ "tags": ["react", "best-practices"],
703
+ "files": [".claude/skills/react-patterns/SKILL.md"]
704
+ }
705
+ ],
706
+ "collections": [
707
+ {
708
+ "id": "fullstack-setup",
709
+ "name": "Full Stack Setup",
710
+ "description": "Complete full-stack development setup with TypeScript and React",
711
+ "version": "1.0.0",
712
+ "category": "development",
713
+ "tags": ["typescript", "react", "fullstack"],
714
+ "icon": "🚀",
715
+ "packages": [
716
+ {
717
+ "packageId": "typescript-rules",
718
+ "version": "^1.0.0",
719
+ "required": true,
720
+ "reason": "TypeScript coding standards for the project"
721
+ },
722
+ {
723
+ "packageId": "react-patterns",
724
+ "version": "^1.0.0",
725
+ "required": true,
726
+ "reason": "React component best practices"
727
+ }
728
+ ]
729
+ }
730
+ ]
305
731
  }
306
732
  ]
307
733
  }