@skill-graph/cli 0.5.6

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 (330) hide show
  1. package/CHANGELOG.md +247 -0
  2. package/LICENSE +200 -0
  3. package/NOTICE +62 -0
  4. package/README.md +398 -0
  5. package/SKILL_GRAPH.md +443 -0
  6. package/bin/skill-graph.js +374 -0
  7. package/docs/ADOPTION.md +117 -0
  8. package/docs/CONFORMANCE.md +66 -0
  9. package/docs/PRIMER.md +384 -0
  10. package/docs/QUICKSTART-30MIN.md +333 -0
  11. package/docs/ROUTING-METRICS.md +120 -0
  12. package/docs/SKILL-MD-FORMAT-COMPATIBILITY.md +127 -0
  13. package/docs/SKILL_AUDIT_CHECKLIST.md +199 -0
  14. package/docs/SKILL_AUDIT_LOOP.md +195 -0
  15. package/docs/SKILL_METADATA_PROTOCOL.md +609 -0
  16. package/docs/_archived/marketplace-publication-priority-2026-05-18.md +239 -0
  17. package/docs/adr/0001-predicate-set.md +69 -0
  18. package/docs/adr/0002-json-ld-context.md +82 -0
  19. package/docs/adr/0003-ontoclean-rigidity-tags.md +65 -0
  20. package/docs/adr/0004-persistent-identifiers.md +74 -0
  21. package/docs/adr/0005-freshness-consolidation.md +70 -0
  22. package/docs/adr/0006-revise-predicate-rename.md +105 -0
  23. package/docs/adr/0007-audit-loop-cadence.md +99 -0
  24. package/docs/adr/0008-skill-surface-split-and-curation-policy.md +93 -0
  25. package/docs/category-consumers.md +168 -0
  26. package/docs/concept-map.md +194 -0
  27. package/docs/diagrams/drift-states.mmd +21 -0
  28. package/docs/diagrams/manifest-pipeline.mmd +25 -0
  29. package/docs/diagrams/routing-harness.mmd +41 -0
  30. package/docs/diagrams/starter-graph.mmd +53 -0
  31. package/docs/field-decision-guide.md +315 -0
  32. package/docs/field-rationale.md +211 -0
  33. package/docs/field-reference.generated.md +624 -0
  34. package/docs/field-reference.md +1426 -0
  35. package/docs/glossary.md +190 -0
  36. package/docs/head-noun-glossary.md +63 -0
  37. package/docs/images/audit-phases.png +0 -0
  38. package/docs/images/drift-states.png +0 -0
  39. package/docs/images/graded-mode.png +0 -0
  40. package/docs/images/manifest-pipeline.png +0 -0
  41. package/docs/images/routing-harness.png +0 -0
  42. package/docs/images/skill-anatomy.png +0 -0
  43. package/docs/images/starter-graph.png +0 -0
  44. package/docs/images/system-model.png +0 -0
  45. package/docs/integrations/github-actions.md +155 -0
  46. package/docs/manifest-field-mapping.md +443 -0
  47. package/docs/marketplace-publication-queue.generated.md +240 -0
  48. package/docs/marketplace-release-agent-prompt.md +82 -0
  49. package/docs/marketplace-skill-candidate-list.md +272 -0
  50. package/docs/marketplace-syndication.md +222 -0
  51. package/docs/migration-sample-review.md +155 -0
  52. package/docs/migrations/v4-to-v5.md +168 -0
  53. package/docs/migrations/v5-to-v6.md +221 -0
  54. package/docs/name-exceptions.yaml +37 -0
  55. package/docs/plans/marketplace-p1-public-migration-plan.md +41 -0
  56. package/docs/plans/multi-root-workspace.md +148 -0
  57. package/docs/plans/scripts-roadmap.md +107 -0
  58. package/docs/plans/v4-schema-bump.md +160 -0
  59. package/docs/plans/wave-2-extraction.md +122 -0
  60. package/docs/positioning-vs-marketplaces.md +175 -0
  61. package/docs/proposals/skill-audit-loop-positioning.md +160 -0
  62. package/docs/quality-doctrine.md +138 -0
  63. package/docs/recommended-skills.md +150 -0
  64. package/docs/research/skill-comprehension-eval-research.md +1830 -0
  65. package/docs/research/skill-retrieval-evidence.md +66 -0
  66. package/docs/skill-metadata-protocol.md +471 -0
  67. package/docs/skills-sh-maintainer-cleanup-request.md +80 -0
  68. package/examples/audits/a11y/findings.md +52 -0
  69. package/examples/audits/a11y/scorecard.md +21 -0
  70. package/examples/audits/a11y/verdict.md +44 -0
  71. package/examples/audits/debugging/findings.md +59 -0
  72. package/examples/audits/debugging/scorecard.md +22 -0
  73. package/examples/audits/debugging/verdict.md +33 -0
  74. package/examples/audits/documentation/findings.md +59 -0
  75. package/examples/audits/documentation/scorecard.md +22 -0
  76. package/examples/audits/documentation/verdict.md +33 -0
  77. package/examples/evals/a11y.json +140 -0
  78. package/examples/evals/api-design.json +52 -0
  79. package/examples/evals/code-review.json +52 -0
  80. package/examples/evals/data-modeling.json +52 -0
  81. package/examples/evals/database-migration.json +52 -0
  82. package/examples/evals/debugging.json +118 -0
  83. package/examples/evals/dependency-architecture.json +52 -0
  84. package/examples/evals/design-system-architecture.json +52 -0
  85. package/examples/evals/error-tracking.json +52 -0
  86. package/examples/evals/event-contract-design.json +52 -0
  87. package/examples/evals/form-ux-architecture.json +52 -0
  88. package/examples/evals/framework-fit-analysis.json +52 -0
  89. package/examples/evals/graph-audit.json +139 -0
  90. package/examples/evals/information-architecture.json +52 -0
  91. package/examples/evals/interaction-feedback.json +52 -0
  92. package/examples/evals/interaction-patterns.json +52 -0
  93. package/examples/evals/layout-composition.json +52 -0
  94. package/examples/evals/lint-overlay.json +117 -0
  95. package/examples/evals/microcopy.json +52 -0
  96. package/examples/evals/observability-modeling.json +52 -0
  97. package/examples/evals/pattern-recognition.json +96 -0
  98. package/examples/evals/performance-engineering.json +52 -0
  99. package/examples/evals/refactor.json +128 -0
  100. package/examples/evals/semiotics.json +52 -0
  101. package/examples/evals/skill-infrastructure.json +96 -0
  102. package/examples/evals/skill-router.json +140 -0
  103. package/examples/evals/skill-router.routing.json +113 -0
  104. package/examples/evals/system-interface-contracts.json +52 -0
  105. package/examples/evals/task-analysis.json +52 -0
  106. package/examples/evals/testing-strategy.json +118 -0
  107. package/examples/evals/type-safety.json +249 -0
  108. package/examples/evals/visual-design-foundations.json +52 -0
  109. package/examples/evals/webhook-integration.json +52 -0
  110. package/examples/exports/a11y.skill-md.md +80 -0
  111. package/examples/exports/debugging.skill-md.md +80 -0
  112. package/examples/exports/refactor.skill-md.md +78 -0
  113. package/examples/exports/testing-strategy.skill-md.md +81 -0
  114. package/examples/projects/markdown-static-site/README.md +115 -0
  115. package/examples/projects/markdown-static-site/skills/content-source-router/SKILL.md +131 -0
  116. package/examples/projects/markdown-static-site/skills/image-optimization-pipeline-config/SKILL.md +132 -0
  117. package/examples/projects/markdown-static-site/skills/link-rot-detection/SKILL.md +103 -0
  118. package/examples/projects/markdown-static-site/skills/markdown-post-frontmatter-validation/SKILL.md +133 -0
  119. package/examples/projects/markdown-static-site/skills/migrate-posts-to-v2-frontmatter/SKILL.md +140 -0
  120. package/examples/projects/saas-stripe-postgres/README.md +208 -0
  121. package/examples/projects/saas-stripe-postgres/db/migrations/0004_canonicalize_orders.sql +37 -0
  122. package/examples/projects/saas-stripe-postgres/db/schema.sql +112 -0
  123. package/examples/projects/saas-stripe-postgres/skills/migrate-orders-to-canonical-schema/SKILL.md +149 -0
  124. package/examples/projects/saas-stripe-postgres/skills/nextjs-server-action-validation/SKILL.md +154 -0
  125. package/examples/projects/saas-stripe-postgres/skills/payment-provider-router/SKILL.md +153 -0
  126. package/examples/projects/saas-stripe-postgres/skills/postgres-rls-pattern/SKILL.md +163 -0
  127. package/examples/projects/saas-stripe-postgres/skills/stripe-webhook-signature-verification/SKILL.md +137 -0
  128. package/examples/protocol/skill-metadata-template.md +301 -0
  129. package/examples/protocol/skills.manifest.sample.json +13245 -0
  130. package/examples/skill-metadata-template.md +317 -0
  131. package/examples/skills.manifest.sample.json +13519 -0
  132. package/examples/tests/v3-1-skos-fixture/SKILL.md +93 -0
  133. package/marketplace/README.md +17 -0
  134. package/marketplace/skills/a11y/SKILL.md +66 -0
  135. package/marketplace/skills/acid-fundamentals/SKILL.md +106 -0
  136. package/marketplace/skills/agent-engineering/SKILL.md +386 -0
  137. package/marketplace/skills/agent-eval-design/SKILL.md +55 -0
  138. package/marketplace/skills/ai-native-development/SKILL.md +294 -0
  139. package/marketplace/skills/api-design/SKILL.md +60 -0
  140. package/marketplace/skills/architecture-decision-records/SKILL.md +55 -0
  141. package/marketplace/skills/background-jobs/SKILL.md +265 -0
  142. package/marketplace/skills/bounded-context-mapping/SKILL.md +55 -0
  143. package/marketplace/skills/cap-theorem-tradeoffs/SKILL.md +127 -0
  144. package/marketplace/skills/client-server-boundary/SKILL.md +187 -0
  145. package/marketplace/skills/code-review/SKILL.md +120 -0
  146. package/marketplace/skills/color-system-design/SKILL.md +43 -0
  147. package/marketplace/skills/component-architecture/SKILL.md +126 -0
  148. package/marketplace/skills/compression/SKILL.md +112 -0
  149. package/marketplace/skills/conceptual-modeling/SKILL.md +181 -0
  150. package/marketplace/skills/connection-pooling/SKILL.md +105 -0
  151. package/marketplace/skills/constraint-awareness/SKILL.md +287 -0
  152. package/marketplace/skills/content-monitor/SKILL.md +209 -0
  153. package/marketplace/skills/context-engineering/SKILL.md +320 -0
  154. package/marketplace/skills/context-graph/SKILL.md +174 -0
  155. package/marketplace/skills/context-management/SKILL.md +174 -0
  156. package/marketplace/skills/context-window/SKILL.md +239 -0
  157. package/marketplace/skills/contract-testing/SKILL.md +120 -0
  158. package/marketplace/skills/cron-scheduling/SKILL.md +223 -0
  159. package/marketplace/skills/dark-mode-implementation/SKILL.md +47 -0
  160. package/marketplace/skills/data-modeling/SKILL.md +59 -0
  161. package/marketplace/skills/data-modeling-fundamentals/SKILL.md +117 -0
  162. package/marketplace/skills/database-migration/SKILL.md +429 -0
  163. package/marketplace/skills/debugging/SKILL.md +67 -0
  164. package/marketplace/skills/dependency-architecture/SKILL.md +58 -0
  165. package/marketplace/skills/design-module-composition/SKILL.md +43 -0
  166. package/marketplace/skills/design-system-architecture/SKILL.md +61 -0
  167. package/marketplace/skills/design-thinking/SKILL.md +44 -0
  168. package/marketplace/skills/diagnosis/SKILL.md +296 -0
  169. package/marketplace/skills/diff-analysis/SKILL.md +188 -0
  170. package/marketplace/skills/e2e-test-design/SKILL.md +113 -0
  171. package/marketplace/skills/entity-relationship-modeling/SKILL.md +218 -0
  172. package/marketplace/skills/epistemic-grounding/SKILL.md +112 -0
  173. package/marketplace/skills/error-boundary/SKILL.md +235 -0
  174. package/marketplace/skills/error-tracking/SKILL.md +261 -0
  175. package/marketplace/skills/eval-driven-development/SKILL.md +147 -0
  176. package/marketplace/skills/evaluation/SKILL.md +113 -0
  177. package/marketplace/skills/event-contract-design/SKILL.md +60 -0
  178. package/marketplace/skills/event-storming/SKILL.md +56 -0
  179. package/marketplace/skills/form-ux-architecture/SKILL.md +60 -0
  180. package/marketplace/skills/framework-fit-analysis/SKILL.md +59 -0
  181. package/marketplace/skills/frontend-architecture/SKILL.md +43 -0
  182. package/marketplace/skills/generative-ui/SKILL.md +118 -0
  183. package/marketplace/skills/graph-audit/SKILL.md +81 -0
  184. package/marketplace/skills/guardrails/SKILL.md +118 -0
  185. package/marketplace/skills/hooks-patterns/SKILL.md +185 -0
  186. package/marketplace/skills/http-semantics/SKILL.md +136 -0
  187. package/marketplace/skills/ideation/SKILL.md +41 -0
  188. package/marketplace/skills/indexing-strategy/SKILL.md +108 -0
  189. package/marketplace/skills/information-architecture/SKILL.md +59 -0
  190. package/marketplace/skills/integration-test-design/SKILL.md +111 -0
  191. package/marketplace/skills/intent-recognition/SKILL.md +136 -0
  192. package/marketplace/skills/interaction-feedback/SKILL.md +59 -0
  193. package/marketplace/skills/interaction-patterns/SKILL.md +59 -0
  194. package/marketplace/skills/journey-mapping/SKILL.md +41 -0
  195. package/marketplace/skills/keywords/SKILL.md +213 -0
  196. package/marketplace/skills/knowledge-modeling/SKILL.md +232 -0
  197. package/marketplace/skills/layout-composition/SKILL.md +59 -0
  198. package/marketplace/skills/linguistics/SKILL.md +429 -0
  199. package/marketplace/skills/lint-overlay/SKILL.md +76 -0
  200. package/marketplace/skills/mental-models/SKILL.md +126 -0
  201. package/marketplace/skills/merge-queue/SKILL.md +94 -0
  202. package/marketplace/skills/methodology/SKILL.md +317 -0
  203. package/marketplace/skills/microcopy/SKILL.md +232 -0
  204. package/marketplace/skills/middleware-patterns/SKILL.md +363 -0
  205. package/marketplace/skills/mobile-responsive-ux/SKILL.md +287 -0
  206. package/marketplace/skills/mutation-testing/SKILL.md +112 -0
  207. package/marketplace/skills/naming-conventions/SKILL.md +112 -0
  208. package/marketplace/skills/observability-modeling/SKILL.md +59 -0
  209. package/marketplace/skills/ontology-modeling/SKILL.md +67 -0
  210. package/marketplace/skills/owasp-security/SKILL.md +153 -0
  211. package/marketplace/skills/pattern-recognition/SKILL.md +472 -0
  212. package/marketplace/skills/performance-budgets/SKILL.md +185 -0
  213. package/marketplace/skills/performance-engineering/SKILL.md +58 -0
  214. package/marketplace/skills/performance-testing/SKILL.md +125 -0
  215. package/marketplace/skills/printify/SKILL.md +42 -0
  216. package/marketplace/skills/prioritization/SKILL.md +118 -0
  217. package/marketplace/skills/problem-framing/SKILL.md +41 -0
  218. package/marketplace/skills/problem-locating-solving/SKILL.md +203 -0
  219. package/marketplace/skills/project-knowledge-extraction/SKILL.md +54 -0
  220. package/marketplace/skills/prompt-craft/SKILL.md +134 -0
  221. package/marketplace/skills/prompt-injection-defense/SKILL.md +132 -0
  222. package/marketplace/skills/property-based-testing/SKILL.md +100 -0
  223. package/marketplace/skills/prototyping/SKILL.md +43 -0
  224. package/marketplace/skills/query-optimization/SKILL.md +144 -0
  225. package/marketplace/skills/real-time-updates/SKILL.md +324 -0
  226. package/marketplace/skills/ref-patterns/SKILL.md +284 -0
  227. package/marketplace/skills/refactor/SKILL.md +65 -0
  228. package/marketplace/skills/rendering-models/SKILL.md +142 -0
  229. package/marketplace/skills/replication-patterns/SKILL.md +110 -0
  230. package/marketplace/skills/research-synthesis/SKILL.md +41 -0
  231. package/marketplace/skills/route-handler-design/SKILL.md +347 -0
  232. package/marketplace/skills/schema-evolution/SKILL.md +140 -0
  233. package/marketplace/skills/security-fundamentals/SKILL.md +139 -0
  234. package/marketplace/skills/semantic-center/SKILL.md +194 -0
  235. package/marketplace/skills/semantic-relations/SKILL.md +250 -0
  236. package/marketplace/skills/semantics/SKILL.md +366 -0
  237. package/marketplace/skills/semiotics/SKILL.md +230 -0
  238. package/marketplace/skills/seo-strategy/SKILL.md +260 -0
  239. package/marketplace/skills/server-actions-design/SKILL.md +243 -0
  240. package/marketplace/skills/server-components-design/SKILL.md +190 -0
  241. package/marketplace/skills/sharding-strategy/SKILL.md +123 -0
  242. package/marketplace/skills/shopify/SKILL.md +42 -0
  243. package/marketplace/skills/skill-infrastructure/SKILL.md +320 -0
  244. package/marketplace/skills/skill-router/SKILL.md +71 -0
  245. package/marketplace/skills/skill-scaffold/SKILL.md +105 -0
  246. package/marketplace/skills/snapshot-testing/SKILL.md +120 -0
  247. package/marketplace/skills/spec-driven-development/SKILL.md +148 -0
  248. package/marketplace/skills/state-machine-modeling/SKILL.md +56 -0
  249. package/marketplace/skills/state-management/SKILL.md +134 -0
  250. package/marketplace/skills/streaming-architecture/SKILL.md +194 -0
  251. package/marketplace/skills/summarization/SKILL.md +156 -0
  252. package/marketplace/skills/suspense-patterns/SKILL.md +265 -0
  253. package/marketplace/skills/system-interface-contracts/SKILL.md +59 -0
  254. package/marketplace/skills/task-analysis/SKILL.md +201 -0
  255. package/marketplace/skills/taxonomy-design/SKILL.md +66 -0
  256. package/marketplace/skills/test-coverage-strategy/SKILL.md +108 -0
  257. package/marketplace/skills/test-doubles-design/SKILL.md +98 -0
  258. package/marketplace/skills/test-driven-development/SKILL.md +96 -0
  259. package/marketplace/skills/testing-strategy/SKILL.md +67 -0
  260. package/marketplace/skills/theme-system-design/SKILL.md +43 -0
  261. package/marketplace/skills/tool-call-flow/SKILL.md +229 -0
  262. package/marketplace/skills/tool-call-strategy/SKILL.md +292 -0
  263. package/marketplace/skills/transaction-isolation/SKILL.md +98 -0
  264. package/marketplace/skills/type-safety/SKILL.md +177 -0
  265. package/marketplace/skills/typography-system/SKILL.md +43 -0
  266. package/marketplace/skills/usability-testing/SKILL.md +43 -0
  267. package/marketplace/skills/user-research/SKILL.md +43 -0
  268. package/marketplace/skills/vercel-composition-patterns/SKILL.md +157 -0
  269. package/marketplace/skills/version-control/SKILL.md +233 -0
  270. package/marketplace/skills/visual-design-foundations/SKILL.md +59 -0
  271. package/marketplace/skills/visual-hierarchy/SKILL.md +43 -0
  272. package/marketplace/skills/webhook-integration/SKILL.md +331 -0
  273. package/marketplace/skills/writing-humanizer/SKILL.md +380 -0
  274. package/package.json +67 -0
  275. package/schemas/manifest.schema.json +811 -0
  276. package/schemas/manifest.v2.schema.json +164 -0
  277. package/schemas/manifest.v3.schema.json +758 -0
  278. package/schemas/manifest.v4.schema.json +755 -0
  279. package/schemas/manifest.v5.schema.json +755 -0
  280. package/schemas/manifest.v6.schema.json +811 -0
  281. package/schemas/skill.context.jsonld +279 -0
  282. package/schemas/skill.schema.json +919 -0
  283. package/schemas/skill.v2.schema.json +201 -0
  284. package/schemas/skill.v3.schema.json +827 -0
  285. package/schemas/skill.v4.schema.json +822 -0
  286. package/schemas/skill.v5.schema.json +830 -0
  287. package/schemas/skill.v6.schema.json +946 -0
  288. package/schemas/vocabulary/keywords.json +180 -0
  289. package/schemas/vocabulary/workspace_tags.json +23 -0
  290. package/scripts/__tests__/migrate-skill-v2-to-v3.test.js +161 -0
  291. package/scripts/__tests__/migrate-skill-v3-to-v4.test.js +158 -0
  292. package/scripts/__tests__/test-export-parser-drift.js +149 -0
  293. package/scripts/__tests__/test-marketplace-export.js +114 -0
  294. package/scripts/__tests__/test-router-paths.js +82 -0
  295. package/scripts/__tests__/test-stability-promotion.js +244 -0
  296. package/scripts/__tests__/test-v3-1-alias-contract.js +109 -0
  297. package/scripts/__tests__/test-v3-1-skos-runtime.js +116 -0
  298. package/scripts/backfill-schema-version.js +198 -0
  299. package/scripts/build-field-reference.js +160 -0
  300. package/scripts/build-retrieval-baseline.js +511 -0
  301. package/scripts/check-markdown-links.js +211 -0
  302. package/scripts/check-protocol-consistency.js +979 -0
  303. package/scripts/export-marketplace-skills.js +610 -0
  304. package/scripts/export-skill.js +374 -0
  305. package/scripts/generate-manifest.js +787 -0
  306. package/scripts/lib/alias-contract.js +83 -0
  307. package/scripts/lib/audit-prompt-builder.js +771 -0
  308. package/scripts/lib/mock-grader.js +134 -0
  309. package/scripts/lib/parse-frontmatter.js +429 -0
  310. package/scripts/lib/roots.js +119 -0
  311. package/scripts/lint/check-archetype-sections.js +185 -0
  312. package/scripts/lint/check-category-enum.js +83 -0
  313. package/scripts/lint/check-routing-eval.js +146 -0
  314. package/scripts/lint/check-routing-quality.js +211 -0
  315. package/scripts/lint/check-stability-promotion.js +220 -0
  316. package/scripts/lint/format-code-frame.js +206 -0
  317. package/scripts/marketplace-install.js +125 -0
  318. package/scripts/migrate-category-to-enum.js +169 -0
  319. package/scripts/migrate-skill-v2-to-v3.js +424 -0
  320. package/scripts/migrate-skill-v3-to-v4.js +200 -0
  321. package/scripts/migrate-skill-v5-to-v6.js +304 -0
  322. package/scripts/restructure-by-category.js +85 -0
  323. package/scripts/seed-publication-classification.js +282 -0
  324. package/scripts/skill-audit.js +893 -0
  325. package/scripts/skill-graph-drift.js +483 -0
  326. package/scripts/skill-graph-route.js +766 -0
  327. package/scripts/skill-graph-routing-eval.js +393 -0
  328. package/scripts/skill-lint.js +1317 -0
  329. package/scripts/skill-overlap.js +213 -0
  330. package/scripts/verify-skill-md-export.js +201 -0
@@ -0,0 +1,282 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ /**
5
+ * seed-publication-classification.js
6
+ *
7
+ * One-off seeder: parses skill-graph/docs/_archived/marketplace-publication-priority-2026-05-18.md
8
+ * (the hand-curated priority doc, now archived) and emits skill-graph/data/publication-classification.json.
9
+ *
10
+ * After this runs once the ledger is hand-edited going forward. Re-running is safe (overwrites with
11
+ * the same content unless the source doc changes).
12
+ *
13
+ * Output is consumed by skill-audit-loop/src/build-skill-audit-worklist.js to build the
14
+ * publicationQueue array in the unified worklist JSON.
15
+ *
16
+ * Usage:
17
+ * node skill-graph/scripts/seed-publication-classification.js
18
+ * node skill-graph/scripts/seed-publication-classification.js --src <path> --dst <path>
19
+ */
20
+
21
+ const fs = require('fs');
22
+ const path = require('path');
23
+
24
+ const REPO_ROOT = path.resolve(__dirname, '../..');
25
+
26
+ function parseArgs(argv) {
27
+ const args = {};
28
+ for (let i = 0; i < argv.length; i++) {
29
+ const a = argv[i];
30
+ if (a.startsWith('--')) {
31
+ const key = a.slice(2);
32
+ const next = argv[i + 1];
33
+ if (next && !next.startsWith('--')) {
34
+ args[key] = next;
35
+ i++;
36
+ } else {
37
+ args[key] = true;
38
+ }
39
+ }
40
+ }
41
+ return args;
42
+ }
43
+
44
+ function normSanitize(cell) {
45
+ if (!cell) return null;
46
+ const c = cell.toLowerCase().trim();
47
+ if (c === 'no') return 'no';
48
+ if (c === 'minor') return 'minor';
49
+ if (c === 'light') return 'minor';
50
+ if (c === 'yes' || c.startsWith('yes')) return 'yes';
51
+ if (c === '—' || c === '-' || c === '') return null;
52
+ return c;
53
+ }
54
+
55
+ function normSource(cell) {
56
+ if (!cell) return null;
57
+ const c = cell.toLowerCase().trim();
58
+ if (c.startsWith('port+sanitize')) return 'port+sanitize';
59
+ if (c.startsWith('port')) return 'port';
60
+ if (c.startsWith('rewrite')) return 'rewrite';
61
+ if (c.startsWith('author')) return 'author';
62
+ if (c === '—' || c === '-' || c === '') return null;
63
+ return c;
64
+ }
65
+
66
+ function normDemand(cell, tier) {
67
+ if (cell) {
68
+ const c = cell.toLowerCase();
69
+ if (c.includes('anthropic') && c.includes('official')) return 'anthropic-official';
70
+ if (c.includes('skills.sh') || c.includes('leaderboard') || c.includes('installs')) return 'skills.sh-leaderboard';
71
+ if (c.includes('demand') || c.includes('topic') || c.includes('cluster')) return 'demand-cluster';
72
+ }
73
+ if (tier === 'S') return 'skills.sh-leaderboard';
74
+ if (tier === 'A') return 'demand-cluster';
75
+ return 'niche';
76
+ }
77
+
78
+ function extractSkill(cell) {
79
+ const m = cell.match(/`([a-z0-9][a-z0-9._-]*)`/i);
80
+ return m ? m[1] : null;
81
+ }
82
+
83
+ function extractRename(cell) {
84
+ const m = cell.match(/→\s*([a-z0-9][a-z0-9._-]*)/i);
85
+ return m ? m[1] : null;
86
+ }
87
+
88
+ function main() {
89
+ const args = parseArgs(process.argv.slice(2));
90
+ const src = args.src
91
+ ? path.resolve(args.src)
92
+ : path.join(REPO_ROOT, 'skill-graph/docs/_archived/marketplace-publication-priority-2026-05-18.md');
93
+ const fallbackSrc = path.join(REPO_ROOT, 'skill-graph/docs/marketplace-publication-priority-2026-05-18.md');
94
+ const dst = args.dst
95
+ ? path.resolve(args.dst)
96
+ : path.join(REPO_ROOT, 'skill-graph/data/publication-classification.json');
97
+
98
+ let srcPath = src;
99
+ if (!fs.existsSync(srcPath) && fs.existsSync(fallbackSrc)) {
100
+ srcPath = fallbackSrc;
101
+ }
102
+ if (!fs.existsSync(srcPath)) {
103
+ console.error(`Source not found: tried ${src} and ${fallbackSrc}`);
104
+ process.exit(1);
105
+ }
106
+
107
+ const md = fs.readFileSync(srcPath, 'utf8');
108
+
109
+ const ledger = {
110
+ schema_version: '1.0.0',
111
+ last_updated: new Date().toISOString(),
112
+ source_of_classifications: path.relative(REPO_ROOT, srcPath),
113
+ description: 'Per-skill publication classification + market-state attributes for the OSS marketplace surface. Seeded once from the 2026-05-18 priority doc; hand-edited going forward. Consumed by skill-audit-loop/src/build-skill-audit-worklist.js to build publicationQueue in the unified worklist JSON.',
114
+ classifications: {
115
+ publishable: 'Generic / portable; recommended for jacob-balslev/skills publication.',
116
+ 'sales-hub-bound': 'References internal schemas, Printify shop IDs, order_events, customer data, etc. Not publishable.',
117
+ 'personal-infra': "Specific to ~/Development monorepo orchestration; no audience outside this repo.",
118
+ },
119
+ skills: {},
120
+ };
121
+
122
+ const lines = md.split('\n');
123
+ let currentTier = null;
124
+ let inTable = false;
125
+ let colIdx = {};
126
+
127
+ for (let i = 0; i < lines.length; i++) {
128
+ const line = lines[i];
129
+
130
+ const tierMatch = line.match(/^##\s+Tier\s+([SABC])\b/);
131
+ if (tierMatch) {
132
+ currentTier = tierMatch[1];
133
+ inTable = false;
134
+ colIdx = {};
135
+ continue;
136
+ }
137
+
138
+ if (/^##\s+Excluded/.test(line) || /^##\s+Recommended/.test(line) || /^##\s+Completeness/.test(line)) {
139
+ currentTier = null;
140
+ inTable = false;
141
+ continue;
142
+ }
143
+
144
+ if (!currentTier) continue;
145
+
146
+ if (/^\|\s*#\s*\|\s*Skill\s*\|/i.test(line)) {
147
+ const headerCols = line.split('|').map((c) => c.trim()).filter(Boolean);
148
+ colIdx = {};
149
+ headerCols.forEach((c, idx) => {
150
+ const k = c.toLowerCase().replace(/\?.*$/, '').replace(/[^a-z]/g, '');
151
+ colIdx[k] = idx;
152
+ });
153
+ inTable = true;
154
+ continue;
155
+ }
156
+
157
+ if (inTable && /^\|\s*-+/.test(line)) continue;
158
+
159
+ if (inTable && line.startsWith('|') && !/^\|\s*$/.test(line)) {
160
+ const cells = line.split('|').map((c) => c.trim());
161
+ const data = cells.slice(1, -1);
162
+ if (data.length < 3) continue;
163
+
164
+ const skillCell = data[colIdx['skill']];
165
+ if (!skillCell) continue;
166
+ const skill = extractSkill(skillCell);
167
+ if (!skill) continue;
168
+
169
+ const popCell = data[colIdx['pop']];
170
+ const popMatch = popCell && popCell.match(/^\s*(\d+)/);
171
+ const pop_score = popMatch ? parseInt(popMatch[1], 10) : null;
172
+
173
+ const source = normSource(data[colIdx['source']]);
174
+
175
+ const sanitizeKey = colIdx['sanitize'] !== undefined ? 'sanitize' : null;
176
+ const needs_sanitization = sanitizeKey ? normSanitize(data[colIdx[sanitizeKey]]) : null;
177
+
178
+ const demandKey = colIdx['demandsignal'] !== undefined
179
+ ? 'demandsignal'
180
+ : (colIdx['notes'] !== undefined ? 'notes' : null);
181
+ const demand_signal = demandKey
182
+ ? normDemand(data[colIdx[demandKey]], currentTier)
183
+ : normDemand(null, currentTier);
184
+
185
+ const notes = (colIdx['notes'] !== undefined ? data[colIdx['notes']] : '') || '';
186
+ const rename = extractRename(skillCell);
187
+
188
+ if (notes && /counted as Tier/i.test(notes) && (!popCell || !popCell.match(/\d/))) continue;
189
+ if (popCell === '—' || popCell === '-' || popCell === '' || pop_score === null) continue;
190
+
191
+ if (!ledger.skills[skill]) {
192
+ const entry = {
193
+ classification: 'publishable',
194
+ tier: currentTier,
195
+ pop_score,
196
+ };
197
+ if (source) entry.source = source;
198
+ if (needs_sanitization) entry.needs_sanitization = needs_sanitization;
199
+ if (demand_signal) entry.demand_signal = demand_signal;
200
+ if (rename) entry.rename_to = rename;
201
+ if (notes) entry.notes = notes;
202
+ ledger.skills[skill] = entry;
203
+ }
204
+ }
205
+ }
206
+
207
+ // Inline backtick tokens that appear in the SH-bound paragraph but are NOT skills —
208
+ // they're schema/column names referenced as exclusion reasons.
209
+ const NON_SKILL_BACKTICK_DENYLIST = new Set([
210
+ 'order_events',
211
+ 'orgQuery',
212
+ 'org_id',
213
+ 'requireOrgAuth',
214
+ 'app_role',
215
+ 'orgScopedQuery',
216
+ 'printify_shop_id',
217
+ 'shop_id',
218
+ ]);
219
+
220
+ const shBoundMatch = md.match(/##\s+Excluded\s+—\s+Sales-Hub-bound[^\n]*\n([\s\S]*?)(?=^##\s)/m);
221
+ if (shBoundMatch) {
222
+ const text = shBoundMatch[1];
223
+ const regex = /`([a-z0-9][a-z0-9._-]*)`(?:\s*\(([^)]+)\))?/gi;
224
+ let m;
225
+ while ((m = regex.exec(text)) !== null) {
226
+ const [, skill, reason] = m;
227
+ if (NON_SKILL_BACKTICK_DENYLIST.has(skill)) continue;
228
+ if (!ledger.skills[skill]) {
229
+ ledger.skills[skill] = {
230
+ classification: 'sales-hub-bound',
231
+ tier: null,
232
+ pop_score: null,
233
+ notes: reason || 'References Sales-Hub-internal schemas/flows',
234
+ };
235
+ }
236
+ }
237
+ }
238
+
239
+ const piMatch = md.match(/##\s+Excluded\s+—\s+Personal-infra[^\n]*\n([\s\S]*?)(?=^##\s|^---)/m);
240
+ if (piMatch) {
241
+ const text = piMatch[1];
242
+ const regex = /`([a-z0-9][a-z0-9._-]*)`(?:\s*\(([^)]+)\))?/gi;
243
+ let m;
244
+ while ((m = regex.exec(text)) !== null) {
245
+ const [, skill, reason] = m;
246
+ if (!ledger.skills[skill]) {
247
+ ledger.skills[skill] = {
248
+ classification: 'personal-infra',
249
+ tier: null,
250
+ pop_score: null,
251
+ notes: reason || 'Internal to ~/Development monorepo orchestration',
252
+ };
253
+ }
254
+ }
255
+ }
256
+
257
+ const tierCounts = { S: 0, A: 0, B: 0, C: 0 };
258
+ const classCounts = { publishable: 0, 'sales-hub-bound': 0, 'personal-infra': 0 };
259
+ for (const entry of Object.values(ledger.skills)) {
260
+ if (entry.tier) tierCounts[entry.tier]++;
261
+ classCounts[entry.classification] = (classCounts[entry.classification] || 0) + 1;
262
+ }
263
+
264
+ fs.mkdirSync(path.dirname(dst), { recursive: true });
265
+ fs.writeFileSync(dst, JSON.stringify(ledger, null, 2) + '\n');
266
+
267
+ console.log(`Wrote ${path.relative(REPO_ROOT, dst)}`);
268
+ console.log(` Total skills: ${Object.keys(ledger.skills).length}`);
269
+ console.log(` Tier counts: S=${tierCounts.S} A=${tierCounts.A} B=${tierCounts.B} C=${tierCounts.C}`);
270
+ console.log(` Class counts:`, classCounts);
271
+ }
272
+
273
+ if (require.main === module) {
274
+ try {
275
+ main();
276
+ } catch (e) {
277
+ console.error(e.stack || e.message);
278
+ process.exit(1);
279
+ }
280
+ }
281
+
282
+ module.exports = { main };