@shnitzel/plugscout 0.3.2 → 0.3.4

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 (133) hide show
  1. package/README.md +16 -15
  2. package/config/registries.json +731 -139
  3. package/data/catalog/items.json +12648 -5624
  4. package/data/catalog/mcps.json +12625 -4985
  5. package/data/catalog/skills.json +965 -691
  6. package/data/catalog/sync-state.json +19 -19
  7. package/dist/catalog/adapter.js +4 -0
  8. package/dist/catalog/adapters/awesome-claude-code-v1.js +150 -0
  9. package/dist/cli.js +0 -0
  10. package/dist/lib/validation/contracts.js +2 -1
  11. package/package.json +6 -5
  12. package/data/security-reports/2026-02-06/report.json +0 -8
  13. package/data/security-reports/2026-02-10/report.json +0 -9
  14. package/data/security-reports/2026-02-11/report.json +0 -9
  15. package/data/security-reports/2026-02-12/report.json +0 -9
  16. package/data/security-reports/2026-02-13/report.json +0 -8
  17. package/data/security-reports/2026-02-14/report.json +0 -8
  18. package/data/security-reports/2026-02-23/report.json +0 -8
  19. package/data/security-reports/2026-02-25/report.json +0 -8
  20. package/data/security-reports/2026-02-26/report.json +0 -8
  21. package/data/security-reports/2026-03-10/report.json +0 -8
  22. package/data/security-reports/audits/2026-02-06T10-17-33-872Z-mcp_remote-browser.json +0 -8
  23. package/data/security-reports/audits/2026-02-06T10-17-33-881Z-mcp_remote-browser.json +0 -8
  24. package/data/security-reports/audits/2026-02-10T20-22-24-474Z-mcp_remote-browser.json +0 -8
  25. package/data/security-reports/audits/2026-02-10T20-22-24-483Z-mcp_remote-browser.json +0 -8
  26. package/data/security-reports/audits/2026-02-10T20-42-12-305Z-mcp_remote-browser.json +0 -8
  27. package/data/security-reports/audits/2026-02-10T20-42-12-319Z-mcp_remote-browser.json +0 -8
  28. package/data/security-reports/audits/2026-02-10T20-43-15-728Z-mcp_remote-browser.json +0 -8
  29. package/data/security-reports/audits/2026-02-10T20-43-15-738Z-mcp_remote-browser.json +0 -8
  30. package/data/security-reports/audits/2026-02-10T21-22-14-047Z-mcp_remote-browser.json +0 -8
  31. package/data/security-reports/audits/2026-02-10T21-22-14-051Z-mcp_remote-browser.json +0 -8
  32. package/data/security-reports/audits/2026-02-10T21-29-59-237Z-mcp_remote-browser.json +0 -8
  33. package/data/security-reports/audits/2026-02-10T21-29-59-243Z-mcp_remote-browser.json +0 -8
  34. package/data/security-reports/audits/2026-02-11T20-21-51-074Z-mcp_remote-browser.json +0 -8
  35. package/data/security-reports/audits/2026-02-11T20-21-51-123Z-mcp_remote-browser.json +0 -8
  36. package/data/security-reports/audits/2026-02-11T20-28-33-021Z-mcp_remote-browser.json +0 -8
  37. package/data/security-reports/audits/2026-02-11T20-28-33-026Z-mcp_remote-browser.json +0 -8
  38. package/data/security-reports/audits/2026-02-11T20-34-43-623Z-mcp_remote-browser.json +0 -8
  39. package/data/security-reports/audits/2026-02-11T20-34-43-625Z-mcp_remote-browser.json +0 -8
  40. package/data/security-reports/audits/2026-02-11T21-06-33-281Z-mcp_remote-browser.json +0 -8
  41. package/data/security-reports/audits/2026-02-11T21-06-33-285Z-mcp_remote-browser.json +0 -8
  42. package/data/security-reports/audits/2026-02-11T21-08-58-836Z-mcp_remote-browser.json +0 -8
  43. package/data/security-reports/audits/2026-02-11T21-08-58-843Z-mcp_remote-browser.json +0 -8
  44. package/data/security-reports/audits/2026-02-12T12-26-07-150Z-mcp_remote-browser.json +0 -8
  45. package/data/security-reports/audits/2026-02-12T12-26-07-159Z-mcp_remote-browser.json +0 -8
  46. package/data/security-reports/audits/2026-02-12T14-37-36-565Z-mcp_remote-browser.json +0 -8
  47. package/data/security-reports/audits/2026-02-12T14-37-36-569Z-mcp_remote-browser.json +0 -8
  48. package/data/security-reports/audits/2026-02-12T14-47-32-103Z-mcp_remote-browser.json +0 -8
  49. package/data/security-reports/audits/2026-02-12T14-47-32-213Z-mcp_remote-browser.json +0 -8
  50. package/data/security-reports/audits/2026-02-12T14-47-47-769Z-mcp_filesystem.json +0 -8
  51. package/data/security-reports/audits/2026-02-12T15-05-49-085Z-mcp_remote-browser.json +0 -8
  52. package/data/security-reports/audits/2026-02-12T15-05-49-087Z-mcp_remote-browser.json +0 -8
  53. package/data/security-reports/audits/2026-02-12T16-37-42-204Z-mcp_remote-browser.json +0 -8
  54. package/data/security-reports/audits/2026-02-12T16-37-42-243Z-mcp_remote-browser.json +0 -8
  55. package/data/security-reports/audits/2026-02-12T16-47-16-589Z-mcp_remote-browser.json +0 -8
  56. package/data/security-reports/audits/2026-02-12T16-47-16-596Z-mcp_remote-browser.json +0 -8
  57. package/data/security-reports/audits/2026-02-12T17-38-24-899Z-mcp_remote-browser.json +0 -8
  58. package/data/security-reports/audits/2026-02-12T17-38-24-905Z-mcp_remote-browser.json +0 -8
  59. package/data/security-reports/audits/2026-02-12T17-56-00-835Z-mcp_remote-browser.json +0 -8
  60. package/data/security-reports/audits/2026-02-12T17-56-00-840Z-mcp_remote-browser.json +0 -8
  61. package/data/security-reports/audits/2026-02-12T18-19-26-005Z-mcp_remote-browser.json +0 -8
  62. package/data/security-reports/audits/2026-02-12T18-19-26-008Z-mcp_remote-browser.json +0 -8
  63. package/data/security-reports/audits/2026-02-12T18-34-38-642Z-mcp_remote-browser.json +0 -8
  64. package/data/security-reports/audits/2026-02-12T18-34-38-645Z-mcp_remote-browser.json +0 -8
  65. package/data/security-reports/audits/2026-02-13T05-44-27-648Z-mcp_remote-browser.json +0 -8
  66. package/data/security-reports/audits/2026-02-13T05-44-27-656Z-mcp_remote-browser.json +0 -8
  67. package/data/security-reports/audits/2026-02-13T05-48-50-827Z-mcp_remote-browser.json +0 -8
  68. package/data/security-reports/audits/2026-02-13T05-48-50-900Z-mcp_remote-browser.json +0 -8
  69. package/data/security-reports/audits/2026-02-13T10-53-33-850Z-mcp_remote-browser.json +0 -8
  70. package/data/security-reports/audits/2026-02-13T10-53-33-853Z-mcp_remote-browser.json +0 -8
  71. package/data/security-reports/audits/2026-02-14T17-51-27-279Z-mcp_remote-browser.json +0 -8
  72. package/data/security-reports/audits/2026-02-14T17-51-27-282Z-mcp_remote-browser.json +0 -8
  73. package/data/security-reports/audits/2026-02-14T19-43-39-991Z-mcp_remote-browser.json +0 -8
  74. package/data/security-reports/audits/2026-02-14T19-43-39-997Z-mcp_remote-browser.json +0 -8
  75. package/data/security-reports/audits/2026-02-23T19-24-43-515Z-mcp_remote-browser.json +0 -8
  76. package/data/security-reports/audits/2026-02-23T19-24-43-518Z-mcp_remote-browser.json +0 -8
  77. package/data/security-reports/audits/2026-02-25T14-45-02-763Z-mcp_remote-browser.json +0 -8
  78. package/data/security-reports/audits/2026-02-25T14-45-02-778Z-mcp_remote-browser.json +0 -8
  79. package/data/security-reports/audits/2026-02-25T14-46-58-957Z-mcp_remote-browser.json +0 -8
  80. package/data/security-reports/audits/2026-02-25T14-46-58-960Z-mcp_remote-browser.json +0 -8
  81. package/data/security-reports/audits/2026-02-25T14-57-37-133Z-mcp_remote-browser.json +0 -8
  82. package/data/security-reports/audits/2026-02-25T14-57-37-139Z-mcp_remote-browser.json +0 -8
  83. package/data/security-reports/audits/2026-02-25T15-03-23-507Z-mcp_remote-browser.json +0 -8
  84. package/data/security-reports/audits/2026-02-25T15-03-23-513Z-mcp_remote-browser.json +0 -8
  85. package/data/security-reports/audits/2026-02-25T15-03-41-157Z-mcp_remote-browser.json +0 -8
  86. package/data/security-reports/audits/2026-02-25T15-03-41-162Z-mcp_remote-browser.json +0 -8
  87. package/data/security-reports/audits/2026-02-25T15-05-18-042Z-mcp_remote-browser.json +0 -8
  88. package/data/security-reports/audits/2026-02-25T15-05-18-048Z-mcp_remote-browser.json +0 -8
  89. package/data/security-reports/audits/2026-02-25T15-39-08-519Z-mcp_remote-browser.json +0 -8
  90. package/data/security-reports/audits/2026-02-25T15-39-08-526Z-mcp_remote-browser.json +0 -8
  91. package/data/security-reports/audits/2026-02-25T18-35-54-463Z-mcp_remote-browser.json +0 -8
  92. package/data/security-reports/audits/2026-02-25T18-35-54-466Z-mcp_remote-browser.json +0 -8
  93. package/data/security-reports/audits/2026-02-26T05-52-21-092Z-mcp_remote-browser.json +0 -8
  94. package/data/security-reports/audits/2026-02-26T05-52-21-093Z-mcp_remote-browser.json +0 -8
  95. package/data/security-reports/audits/2026-02-26T05-52-27-076Z-mcp_remote-browser.json +0 -8
  96. package/data/security-reports/audits/2026-02-26T05-52-27-079Z-mcp_remote-browser.json +0 -8
  97. package/data/security-reports/audits/2026-02-26T05-52-27-084Z-mcp_remote-browser.json +0 -8
  98. package/data/security-reports/audits/2026-02-26T05-52-27-086Z-mcp_remote-browser.json +0 -8
  99. package/data/security-reports/audits/2026-02-26T05-52-37-249Z-mcp_remote-browser.json +0 -8
  100. package/data/security-reports/audits/2026-02-26T05-52-37-258Z-mcp_remote-browser.json +0 -8
  101. package/data/security-reports/audits/2026-02-26T05-52-37-259Z-mcp_remote-browser.json +0 -8
  102. package/data/security-reports/audits/2026-02-26T05-52-37-274Z-mcp_remote-browser.json +0 -8
  103. package/data/security-reports/audits/2026-02-26T05-53-28-389Z-mcp_remote-browser.json +0 -8
  104. package/data/security-reports/audits/2026-02-26T05-53-28-391Z-mcp_remote-browser.json +0 -8
  105. package/data/security-reports/audits/2026-02-26T05-53-33-868Z-mcp_remote-browser.json +0 -8
  106. package/data/security-reports/audits/2026-02-26T05-53-33-880Z-mcp_remote-browser.json +0 -8
  107. package/data/security-reports/audits/2026-02-26T05-53-33-892Z-mcp_remote-browser.json +0 -8
  108. package/data/security-reports/audits/2026-02-26T05-53-33-900Z-mcp_remote-browser.json +0 -8
  109. package/data/security-reports/audits/2026-02-26T05-53-43-064Z-mcp_remote-browser.json +0 -8
  110. package/data/security-reports/audits/2026-02-26T05-53-43-066Z-mcp_remote-browser.json +0 -8
  111. package/data/security-reports/audits/2026-02-26T05-53-43-068Z-mcp_remote-browser.json +0 -8
  112. package/data/security-reports/audits/2026-02-26T14-55-47-466Z-claude-plugin_workspace-ops.json +0 -8
  113. package/data/security-reports/audits/2026-02-26T14-55-47-468Z-copilot-extension_repo-security.json +0 -8
  114. package/data/security-reports/audits/2026-02-26T16-55-59-431Z-mcp_remote-browser.json +0 -8
  115. package/data/security-reports/audits/2026-02-26T16-55-59-432Z-mcp_remote-browser.json +0 -8
  116. package/data/security-reports/audits/2026-02-26T16-55-59-435Z-mcp_remote-browser.json +0 -8
  117. package/data/security-reports/audits/2026-02-26T16-55-59-439Z-mcp_remote-browser.json +0 -8
  118. package/data/security-reports/audits/2026-02-26T16-56-08-566Z-mcp_remote-browser.json +0 -8
  119. package/data/security-reports/audits/2026-02-26T16-56-08-570Z-mcp_remote-browser.json +0 -8
  120. package/data/security-reports/audits/2026-02-26T16-56-08-589Z-mcp_remote-browser.json +0 -8
  121. package/data/security-reports/audits/2026-02-26T16-56-08-591Z-mcp_remote-browser.json +0 -8
  122. package/data/security-reports/audits/2026-02-26T16-56-47-356Z-mcp_remote-browser.json +0 -8
  123. package/data/security-reports/audits/2026-02-26T16-56-47-358Z-mcp_remote-browser.json +0 -8
  124. package/data/security-reports/audits/2026-02-26T16-56-53-607Z-mcp_remote-browser.json +0 -8
  125. package/data/security-reports/audits/2026-02-26T16-56-53-612Z-mcp_remote-browser.json +0 -8
  126. package/data/security-reports/audits/2026-02-26T16-56-53-624Z-mcp_remote-browser.json +0 -8
  127. package/data/security-reports/audits/2026-02-26T16-56-53-628Z-mcp_remote-browser.json +0 -8
  128. package/data/security-reports/audits/2026-02-26T16-57-09-879Z-mcp_remote-browser.json +0 -8
  129. package/data/security-reports/audits/2026-02-26T16-57-09-881Z-mcp_remote-browser.json +0 -8
  130. package/data/security-reports/audits/2026-02-26T16-57-10-846Z-mcp_remote-browser.json +0 -8
  131. package/data/security-reports/audits/2026-02-26T16-57-10-848Z-mcp_remote-browser.json +0 -8
  132. package/data/security-reports/audits/2026-03-10T18-15-05-007Z-claude-plugin_playwright.json +0 -8
  133. package/data/security-reports/audits/2026-03-10T18-36-16-092Z-claude-plugin_playwright.json +0 -8
@@ -1,62 +1,62 @@
1
1
  {
2
2
  "registries": {
3
3
  "community-skills-index": {
4
- "lastSuccessfulSyncAt": "2026-03-19T04:24:36.182Z"
4
+ "lastSuccessfulSyncAt": "2026-03-22T05:00:10.783Z"
5
5
  },
6
6
  "public-mcp-directory": {
7
- "lastSuccessfulSyncAt": "2026-03-19T04:24:44.707Z",
7
+ "lastSuccessfulSyncAt": "2026-03-22T05:00:17.034Z",
8
8
  "lastUpdatedSince": "2026-02-25T14:46:42.122Z"
9
9
  },
10
10
  "official-claude-plugins": {
11
- "lastSuccessfulSyncAt": "2026-03-19T04:24:46.007Z"
11
+ "lastSuccessfulSyncAt": "2026-03-22T05:00:17.502Z"
12
12
  },
13
13
  "official-copilot-extensions": {
14
- "lastSuccessfulSyncAt": "2026-03-19T04:24:46.767Z"
14
+ "lastSuccessfulSyncAt": "2026-03-22T05:00:17.700Z"
15
15
  },
16
16
  "openai-skills-curated": {
17
- "lastSuccessfulSyncAt": "2026-03-19T04:24:44.975Z"
17
+ "lastSuccessfulSyncAt": "2026-03-22T05:00:17.097Z"
18
18
  },
19
19
  "github-copilot-plugins-official": {
20
- "lastSuccessfulSyncAt": "2026-03-19T04:24:46.878Z"
20
+ "lastSuccessfulSyncAt": "2026-03-22T05:00:17.713Z"
21
21
  },
22
22
  "github-awesome-copilot-marketplace": {
23
- "lastSuccessfulSyncAt": "2026-03-19T04:24:47.019Z"
23
+ "lastSuccessfulSyncAt": "2026-03-22T05:00:17.724Z"
24
24
  },
25
25
  "anthropic-claude-connectors-scrape": {
26
- "lastSuccessfulSyncAt": "2026-03-19T04:24:47.120Z"
26
+ "lastSuccessfulSyncAt": "2026-03-22T05:00:17.832Z"
27
27
  },
28
28
  "github-curated-industry-skills": {
29
- "lastSuccessfulSyncAt": "2026-03-19T04:24:36.183Z"
29
+ "lastSuccessfulSyncAt": "2026-03-22T05:00:10.784Z"
30
30
  },
31
31
  "anthropic-skills": {
32
- "lastSuccessfulSyncAt": "2026-03-19T04:24:45.128Z"
32
+ "lastSuccessfulSyncAt": "2026-03-22T05:00:17.144Z"
33
33
  },
34
34
  "github-n-skills-marketplace": {
35
- "lastSuccessfulSyncAt": "2026-03-19T04:24:45.286Z"
35
+ "lastSuccessfulSyncAt": "2026-03-22T05:00:17.191Z"
36
36
  },
37
37
  "trailofbits-skills-marketplace": {
38
- "lastSuccessfulSyncAt": "2026-03-19T04:24:45.409Z"
38
+ "lastSuccessfulSyncAt": "2026-03-22T05:00:17.218Z"
39
39
  },
40
40
  "github-mhattingpete-claude-skills": {
41
- "lastSuccessfulSyncAt": "2026-03-19T04:24:45.577Z"
41
+ "lastSuccessfulSyncAt": "2026-03-22T05:00:17.246Z"
42
42
  },
43
43
  "github-neon-ai-rules": {
44
- "lastSuccessfulSyncAt": "2026-03-19T04:24:45.751Z"
44
+ "lastSuccessfulSyncAt": "2026-03-22T05:00:17.277Z"
45
45
  },
46
46
  "anthropic-claude-plugins-official-github": {
47
- "lastSuccessfulSyncAt": "2026-03-19T04:24:46.158Z"
47
+ "lastSuccessfulSyncAt": "2026-03-22T05:00:17.540Z"
48
48
  },
49
49
  "anthropic-knowledge-work-plugins": {
50
- "lastSuccessfulSyncAt": "2026-03-19T04:24:46.292Z"
50
+ "lastSuccessfulSyncAt": "2026-03-22T05:00:17.591Z"
51
51
  },
52
52
  "anthropic-financial-services-plugins": {
53
- "lastSuccessfulSyncAt": "2026-03-19T04:24:46.449Z"
53
+ "lastSuccessfulSyncAt": "2026-03-22T05:00:17.631Z"
54
54
  },
55
55
  "github-docker-claude-plugins": {
56
- "lastSuccessfulSyncAt": "2026-03-19T04:24:46.628Z"
56
+ "lastSuccessfulSyncAt": "2026-03-22T05:00:17.671Z"
57
57
  },
58
58
  "github-pleaseai-claude-code-plugins": {
59
- "lastSuccessfulSyncAt": "2026-03-19T04:24:46.767Z"
59
+ "lastSuccessfulSyncAt": "2026-03-22T05:00:17.700Z"
60
60
  }
61
61
  }
62
62
  }
@@ -1,3 +1,4 @@
1
+ import { adaptAwesomeClaudeCodeEntries } from './adapters/awesome-claude-code-v1.js';
1
2
  import { adaptClaudeConnectorsScrapeEntries } from './adapters/claude-connectors-scrape-v1.js';
2
3
  import { adaptClaudeCodeMarketplaceEntries } from './adapters/claude-code-marketplace-v1.js';
3
4
  import { adaptClaudePluginsEntries } from './adapters/claude-plugins-v0.1.js';
@@ -35,5 +36,8 @@ export function adaptRegistryEntries(registry, entries) {
35
36
  if (registry.adapter === 'claude-connectors-scrape-v1') {
36
37
  return adaptClaudeConnectorsScrapeEntries(registry.id, entries);
37
38
  }
39
+ if (registry.adapter === 'awesome-claude-code-v1') {
40
+ return adaptAwesomeClaudeCodeEntries(registry.id, entries);
41
+ }
38
42
  return entries;
39
43
  }
@@ -0,0 +1,150 @@
1
+ import { dedupe, sanitizeUrl, slugify, stripHtml } from './shared.js';
2
+ const TRUSTED_HOSTS = ['github.com', 'raw.githubusercontent.com'];
3
+ const CSV_COLUMNS = [
4
+ 'ID', 'Display Name', 'Category', 'Sub-Category', 'Primary Link',
5
+ 'Secondary Link', 'Author Name', 'Author Link', 'Active', 'Date Added',
6
+ 'Last Modified', 'Last Checked', 'License', 'Description',
7
+ 'Removed From Origin', 'Stale', 'Repo Created', 'Latest Release',
8
+ 'Release Version', 'Release Source'
9
+ ];
10
+ export function adaptAwesomeClaudeCodeEntries(sourceId, entries) {
11
+ const csv = entries.find((entry) => typeof entry === 'string');
12
+ if (typeof csv !== 'string' || csv.trim().length === 0) {
13
+ return [];
14
+ }
15
+ const rows = parseCsv(csv);
16
+ if (rows.length < 2)
17
+ return [];
18
+ const header = rows[0];
19
+ const dataRows = rows.slice(1);
20
+ const mapped = [];
21
+ const seen = new Set();
22
+ for (const rawRow of dataRows) {
23
+ const row = zipRow(header, rawRow);
24
+ if (!row)
25
+ continue;
26
+ if (row['Active'].toUpperCase() !== 'TRUE')
27
+ continue;
28
+ if (row['Stale'].toUpperCase() === 'TRUE')
29
+ continue;
30
+ if (row['Removed From Origin'].toUpperCase() === 'TRUE')
31
+ continue;
32
+ const rawName = row['Display Name'].trim();
33
+ const primaryLink = row['Primary Link'].trim();
34
+ const description = row['Description'].trim();
35
+ const category = row['Category'].trim();
36
+ const releaseVersion = row['Release Version'].trim();
37
+ const lastModified = row['Last Modified'].trim();
38
+ const authorName = row['Author Name'].trim();
39
+ const license = row['License'].trim();
40
+ if (!rawName || !primaryLink)
41
+ continue;
42
+ const slug = slugify(rawName);
43
+ if (!slug || seen.has(slug))
44
+ continue;
45
+ const url = sanitizeUrl(primaryLink, TRUSTED_HOSTS);
46
+ seen.add(slug);
47
+ const capabilities = inferCapabilities(rawName, description, category);
48
+ const hasRelease = releaseVersion.length > 0;
49
+ const hasModified = lastModified.length > 0;
50
+ mapped.push({
51
+ id: `skill:${slug}`,
52
+ kind: 'skill',
53
+ provider: 'github',
54
+ name: rawName.slice(0, 120),
55
+ description: stripHtml(description || `${category} resource for Claude Code: ${rawName}.`, 320) || `Claude Code ${category} resource: ${rawName}.`,
56
+ capabilities,
57
+ compatibility: ['claude-code'],
58
+ source: sourceId,
59
+ install: {
60
+ kind: 'manual',
61
+ instructions: 'Visit the linked repository and follow its installation instructions.',
62
+ ...(url ? { url } : {})
63
+ },
64
+ adoptionSignal: 72,
65
+ maintenanceSignal: hasRelease ? 78 : hasModified ? 70 : 62,
66
+ provenanceSignal: 82,
67
+ freshnessSignal: hasModified ? 72 : 60,
68
+ securitySignals: {
69
+ knownVulnerabilities: 0,
70
+ suspiciousPatterns: 0,
71
+ injectionFindings: 0,
72
+ exfiltrationSignals: 0,
73
+ integrityAlerts: 0
74
+ },
75
+ metadata: {
76
+ catalogType: 'skill',
77
+ sourceConfidence: 'vetted-curated',
78
+ awesomeClaudeCodeId: row['ID'],
79
+ awesomeClaudeCodeCategory: category,
80
+ ...(authorName ? { authorName } : {}),
81
+ ...(license ? { license } : {}),
82
+ ...(releaseVersion ? { releaseVersion } : {})
83
+ }
84
+ });
85
+ }
86
+ return mapped;
87
+ }
88
+ function zipRow(header, values) {
89
+ if (values.length === 0)
90
+ return null;
91
+ const row = {};
92
+ for (let i = 0; i < header.length; i++) {
93
+ row[header[i]] = values[i] ?? '';
94
+ }
95
+ return row;
96
+ }
97
+ function inferCapabilities(name, description, category) {
98
+ const haystack = `${name} ${description} ${category}`.toLowerCase();
99
+ const capabilities = [];
100
+ if (/(security|audit|vulnerability|compliance|malware)/.test(haystack))
101
+ capabilities.push('security');
102
+ if (/(workflow|automation|ci|cd|devops|deploy|pipeline)/.test(haystack))
103
+ capabilities.push('automation');
104
+ if (/(frontend|ui|design|css|react|vue|html)/.test(haystack))
105
+ capabilities.push('frontend');
106
+ if (/(database|sql|postgres|redis|mongo)/.test(haystack))
107
+ capabilities.push('data');
108
+ if (/(docs|documentation|guide|knowledge|handbook)/.test(haystack))
109
+ capabilities.push('docs');
110
+ if (/(test|debug|review|qa|lint)/.test(haystack))
111
+ capabilities.push('guardrails');
112
+ if (/(agent|orchestrat|subagent|multi-agent)/.test(haystack))
113
+ capabilities.push('orchestration');
114
+ return dedupe(capabilities.length ? capabilities : ['automation']);
115
+ }
116
+ function parseCsv(text) {
117
+ const rows = [];
118
+ for (const line of text.split('\n')) {
119
+ if (line.trim().length === 0)
120
+ continue;
121
+ rows.push(parseCsvLine(line));
122
+ }
123
+ return rows;
124
+ }
125
+ function parseCsvLine(line) {
126
+ const fields = [];
127
+ let current = '';
128
+ let inQuotes = false;
129
+ for (let i = 0; i < line.length; i++) {
130
+ const char = line[i];
131
+ if (char === '"') {
132
+ if (inQuotes && line[i + 1] === '"') {
133
+ current += '"';
134
+ i++;
135
+ }
136
+ else {
137
+ inQuotes = !inQuotes;
138
+ }
139
+ }
140
+ else if (char === ',' && !inQuotes) {
141
+ fields.push(current.trim());
142
+ current = '';
143
+ }
144
+ else {
145
+ current += char;
146
+ }
147
+ }
148
+ fields.push(current.trim());
149
+ return fields;
150
+ }
package/dist/cli.js CHANGED
File without changes
@@ -136,7 +136,8 @@ export const RegistrySchema = z.object({
136
136
  'claude-code-marketplace-v1',
137
137
  'copilot-extensions-v0.1',
138
138
  'copilot-plugin-marketplace-v1',
139
- 'claude-connectors-scrape-v1'
139
+ 'claude-connectors-scrape-v1',
140
+ 'awesome-claude-code-v1'
140
141
  ])
141
142
  .default('direct'),
142
143
  enabled: z.boolean().default(true),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shnitzel/plugscout",
3
- "version": "0.3.2",
3
+ "version": "0.3.4",
4
4
  "description": "Claude plugins + Claude connectors + Copilot extensions + Skills + MCP security intelligence framework",
5
5
  "private": false,
6
6
  "type": "module",
@@ -41,6 +41,7 @@
41
41
  "node": ">=18.17"
42
42
  },
43
43
  "scripts": {
44
+ "prepare": "git config core.hooksPath .githooks || true",
44
45
  "dev": "TS_NODE_TRANSPILE_ONLY=1 node --loader ts-node/esm src/cli.ts",
45
46
  "setup": "TS_NODE_TRANSPILE_ONLY=1 node --loader ts-node/esm src/cli.ts setup",
46
47
  "build": "tsc -p tsconfig.json",
@@ -77,14 +78,14 @@
77
78
  "quarantine:apply": "TS_NODE_TRANSPILE_ONLY=1 node --loader ts-node/esm src/cli.ts quarantine apply"
78
79
  },
79
80
  "dependencies": {
80
- "fs-extra": "^11.2.0",
81
+ "fs-extra": "^11.3.4",
81
82
  "semver": "^7.7.4",
82
83
  "zod": "^3.23.8"
83
84
  },
84
85
  "devDependencies": {
85
- "@types/node": "^25.3.0",
86
+ "@types/node": "^25.5.0",
86
87
  "@types/react": "^19.2.14",
87
- "@remotion/cli": "4.0.427",
88
+ "@remotion/cli": "4.0.438",
88
89
  "@types/semver": "^7.7.1",
89
90
  "@typescript-eslint/eslint-plugin": "^7.10.0",
90
91
  "@typescript-eslint/parser": "^7.10.0",
@@ -93,7 +94,7 @@
93
94
  "prettier": "^3.2.5",
94
95
  "react": "^19.2.4",
95
96
  "react-dom": "^19.2.4",
96
- "remotion": "4.0.427",
97
+ "remotion": "4.0.438",
97
98
  "ts-node": "^10.9.2",
98
99
  "tsx": "^4.7.1",
99
100
  "typescript": "^5.4.5",
@@ -1,8 +0,0 @@
1
- {
2
- "generatedAt": "2026-02-06T10:17:33.910Z",
3
- "passed": [
4
- "mcp:filesystem",
5
- "skill:secure-prompting"
6
- ],
7
- "failed": []
8
- }
@@ -1,9 +0,0 @@
1
- {
2
- "generatedAt": "2026-02-10T21:29:59.250Z",
3
- "staleRegistries": [],
4
- "passed": [
5
- "mcp:filesystem",
6
- "skill:secure-prompting"
7
- ],
8
- "failed": []
9
- }
@@ -1,9 +0,0 @@
1
- {
2
- "generatedAt": "2026-02-11T21:08:58.848Z",
3
- "staleRegistries": [],
4
- "passed": [
5
- "mcp:filesystem",
6
- "skill:secure-prompting"
7
- ],
8
- "failed": []
9
- }
@@ -1,9 +0,0 @@
1
- {
2
- "generatedAt": "2026-02-12T18:34:38.648Z",
3
- "staleRegistries": [],
4
- "passed": [
5
- "mcp:filesystem",
6
- "skill:secure-prompting"
7
- ],
8
- "failed": []
9
- }
@@ -1,8 +0,0 @@
1
- {
2
- "generatedAt": "2026-02-13T10:53:33.857Z",
3
- "staleRegistries": [],
4
- "passed": [
5
- "skill:secure-prompting"
6
- ],
7
- "failed": []
8
- }
@@ -1,8 +0,0 @@
1
- {
2
- "generatedAt": "2026-02-14T19:43:52.401Z",
3
- "staleRegistries": [],
4
- "passed": [
5
- "skill:secure-prompting"
6
- ],
7
- "failed": []
8
- }
@@ -1,8 +0,0 @@
1
- {
2
- "generatedAt": "2026-02-23T19:24:43.522Z",
3
- "staleRegistries": [],
4
- "passed": [
5
- "skill:secure-prompting"
6
- ],
7
- "failed": []
8
- }
@@ -1,8 +0,0 @@
1
- {
2
- "generatedAt": "2026-02-25T18:35:54.474Z",
3
- "staleRegistries": [],
4
- "passed": [
5
- "skill:secure-prompting"
6
- ],
7
- "failed": []
8
- }
@@ -1,8 +0,0 @@
1
- {
2
- "generatedAt": "2026-02-26T16:57:10.852Z",
3
- "staleRegistries": [],
4
- "passed": [
5
- "skill:secure-prompting"
6
- ],
7
- "failed": []
8
- }
@@ -1,8 +0,0 @@
1
- {
2
- "generatedAt": "2026-03-10T17:23:52.559Z",
3
- "staleRegistries": [],
4
- "passed": [
5
- "skill:secure-prompting"
6
- ],
7
- "failed": []
8
- }
@@ -1,8 +0,0 @@
1
- {
2
- "id": "mcp:remote-browser",
3
- "requestedAt": "2026-02-06T10:17:33.872Z",
4
- "policyDecision": "blocked",
5
- "overrideUsed": false,
6
- "installer": "skill.sh",
7
- "exitCode": 1
8
- }
@@ -1,8 +0,0 @@
1
- {
2
- "id": "mcp:remote-browser",
3
- "requestedAt": "2026-02-06T10:17:33.881Z",
4
- "policyDecision": "override-allowed",
5
- "overrideUsed": true,
6
- "installer": "skill.sh",
7
- "exitCode": 0
8
- }
@@ -1,8 +0,0 @@
1
- {
2
- "id": "mcp:remote-browser",
3
- "requestedAt": "2026-02-10T20:22:24.474Z",
4
- "policyDecision": "blocked",
5
- "overrideUsed": false,
6
- "installer": "skill.sh",
7
- "exitCode": 1
8
- }
@@ -1,8 +0,0 @@
1
- {
2
- "id": "mcp:remote-browser",
3
- "requestedAt": "2026-02-10T20:22:24.483Z",
4
- "policyDecision": "override-allowed",
5
- "overrideUsed": true,
6
- "installer": "skill.sh",
7
- "exitCode": 0
8
- }
@@ -1,8 +0,0 @@
1
- {
2
- "id": "mcp:remote-browser",
3
- "requestedAt": "2026-02-10T20:42:12.305Z",
4
- "policyDecision": "blocked",
5
- "overrideUsed": false,
6
- "installer": "skill.sh",
7
- "exitCode": 1
8
- }
@@ -1,8 +0,0 @@
1
- {
2
- "id": "mcp:remote-browser",
3
- "requestedAt": "2026-02-10T20:42:12.319Z",
4
- "policyDecision": "override-allowed",
5
- "overrideUsed": true,
6
- "installer": "skill.sh",
7
- "exitCode": 0
8
- }
@@ -1,8 +0,0 @@
1
- {
2
- "id": "mcp:remote-browser",
3
- "requestedAt": "2026-02-10T20:43:15.728Z",
4
- "policyDecision": "blocked",
5
- "overrideUsed": false,
6
- "installer": "skill.sh",
7
- "exitCode": 1
8
- }
@@ -1,8 +0,0 @@
1
- {
2
- "id": "mcp:remote-browser",
3
- "requestedAt": "2026-02-10T20:43:15.738Z",
4
- "policyDecision": "override-allowed",
5
- "overrideUsed": true,
6
- "installer": "skill.sh",
7
- "exitCode": 0
8
- }
@@ -1,8 +0,0 @@
1
- {
2
- "id": "mcp:remote-browser",
3
- "requestedAt": "2026-02-10T21:22:14.047Z",
4
- "policyDecision": "blocked",
5
- "overrideUsed": false,
6
- "installer": "skill.sh",
7
- "exitCode": 1
8
- }
@@ -1,8 +0,0 @@
1
- {
2
- "id": "mcp:remote-browser",
3
- "requestedAt": "2026-02-10T21:22:14.051Z",
4
- "policyDecision": "override-allowed",
5
- "overrideUsed": true,
6
- "installer": "skill.sh",
7
- "exitCode": 0
8
- }
@@ -1,8 +0,0 @@
1
- {
2
- "id": "mcp:remote-browser",
3
- "requestedAt": "2026-02-10T21:29:59.237Z",
4
- "policyDecision": "blocked",
5
- "overrideUsed": false,
6
- "installer": "skill.sh",
7
- "exitCode": 1
8
- }
@@ -1,8 +0,0 @@
1
- {
2
- "id": "mcp:remote-browser",
3
- "requestedAt": "2026-02-10T21:29:59.243Z",
4
- "policyDecision": "override-allowed",
5
- "overrideUsed": true,
6
- "installer": "skill.sh",
7
- "exitCode": 0
8
- }
@@ -1,8 +0,0 @@
1
- {
2
- "id": "mcp:remote-browser",
3
- "requestedAt": "2026-02-11T20:21:51.074Z",
4
- "policyDecision": "blocked",
5
- "overrideUsed": false,
6
- "installer": "skill.sh",
7
- "exitCode": 1
8
- }
@@ -1,8 +0,0 @@
1
- {
2
- "id": "mcp:remote-browser",
3
- "requestedAt": "2026-02-11T20:21:51.123Z",
4
- "policyDecision": "override-allowed",
5
- "overrideUsed": true,
6
- "installer": "skill.sh",
7
- "exitCode": 0
8
- }
@@ -1,8 +0,0 @@
1
- {
2
- "id": "mcp:remote-browser",
3
- "requestedAt": "2026-02-11T20:28:33.021Z",
4
- "policyDecision": "blocked",
5
- "overrideUsed": false,
6
- "installer": "skill.sh",
7
- "exitCode": 1
8
- }
@@ -1,8 +0,0 @@
1
- {
2
- "id": "mcp:remote-browser",
3
- "requestedAt": "2026-02-11T20:28:33.026Z",
4
- "policyDecision": "override-allowed",
5
- "overrideUsed": true,
6
- "installer": "skill.sh",
7
- "exitCode": 0
8
- }
@@ -1,8 +0,0 @@
1
- {
2
- "id": "mcp:remote-browser",
3
- "requestedAt": "2026-02-11T20:34:43.623Z",
4
- "policyDecision": "blocked",
5
- "overrideUsed": false,
6
- "installer": "skill.sh",
7
- "exitCode": 1
8
- }
@@ -1,8 +0,0 @@
1
- {
2
- "id": "mcp:remote-browser",
3
- "requestedAt": "2026-02-11T20:34:43.625Z",
4
- "policyDecision": "override-allowed",
5
- "overrideUsed": true,
6
- "installer": "skill.sh",
7
- "exitCode": 0
8
- }
@@ -1,8 +0,0 @@
1
- {
2
- "id": "mcp:remote-browser",
3
- "requestedAt": "2026-02-11T21:06:33.281Z",
4
- "policyDecision": "blocked",
5
- "overrideUsed": false,
6
- "installer": "skill.sh",
7
- "exitCode": 1
8
- }
@@ -1,8 +0,0 @@
1
- {
2
- "id": "mcp:remote-browser",
3
- "requestedAt": "2026-02-11T21:06:33.285Z",
4
- "policyDecision": "override-allowed",
5
- "overrideUsed": true,
6
- "installer": "skill.sh",
7
- "exitCode": 0
8
- }
@@ -1,8 +0,0 @@
1
- {
2
- "id": "mcp:remote-browser",
3
- "requestedAt": "2026-02-11T21:08:58.836Z",
4
- "policyDecision": "blocked",
5
- "overrideUsed": false,
6
- "installer": "skill.sh",
7
- "exitCode": 1
8
- }
@@ -1,8 +0,0 @@
1
- {
2
- "id": "mcp:remote-browser",
3
- "requestedAt": "2026-02-11T21:08:58.843Z",
4
- "policyDecision": "override-allowed",
5
- "overrideUsed": true,
6
- "installer": "skill.sh",
7
- "exitCode": 0
8
- }
@@ -1,8 +0,0 @@
1
- {
2
- "id": "mcp:remote-browser",
3
- "requestedAt": "2026-02-12T12:26:07.150Z",
4
- "policyDecision": "blocked",
5
- "overrideUsed": false,
6
- "installer": "skill.sh",
7
- "exitCode": 1
8
- }
@@ -1,8 +0,0 @@
1
- {
2
- "id": "mcp:remote-browser",
3
- "requestedAt": "2026-02-12T12:26:07.159Z",
4
- "policyDecision": "override-allowed",
5
- "overrideUsed": true,
6
- "installer": "skill.sh",
7
- "exitCode": 0
8
- }