@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.
- package/CHANGELOG.md +247 -0
- package/LICENSE +200 -0
- package/NOTICE +62 -0
- package/README.md +398 -0
- package/SKILL_GRAPH.md +443 -0
- package/bin/skill-graph.js +374 -0
- package/docs/ADOPTION.md +117 -0
- package/docs/CONFORMANCE.md +66 -0
- package/docs/PRIMER.md +384 -0
- package/docs/QUICKSTART-30MIN.md +333 -0
- package/docs/ROUTING-METRICS.md +120 -0
- package/docs/SKILL-MD-FORMAT-COMPATIBILITY.md +127 -0
- package/docs/SKILL_AUDIT_CHECKLIST.md +199 -0
- package/docs/SKILL_AUDIT_LOOP.md +195 -0
- package/docs/SKILL_METADATA_PROTOCOL.md +609 -0
- package/docs/_archived/marketplace-publication-priority-2026-05-18.md +239 -0
- package/docs/adr/0001-predicate-set.md +69 -0
- package/docs/adr/0002-json-ld-context.md +82 -0
- package/docs/adr/0003-ontoclean-rigidity-tags.md +65 -0
- package/docs/adr/0004-persistent-identifiers.md +74 -0
- package/docs/adr/0005-freshness-consolidation.md +70 -0
- package/docs/adr/0006-revise-predicate-rename.md +105 -0
- package/docs/adr/0007-audit-loop-cadence.md +99 -0
- package/docs/adr/0008-skill-surface-split-and-curation-policy.md +93 -0
- package/docs/category-consumers.md +168 -0
- package/docs/concept-map.md +194 -0
- package/docs/diagrams/drift-states.mmd +21 -0
- package/docs/diagrams/manifest-pipeline.mmd +25 -0
- package/docs/diagrams/routing-harness.mmd +41 -0
- package/docs/diagrams/starter-graph.mmd +53 -0
- package/docs/field-decision-guide.md +315 -0
- package/docs/field-rationale.md +211 -0
- package/docs/field-reference.generated.md +624 -0
- package/docs/field-reference.md +1426 -0
- package/docs/glossary.md +190 -0
- package/docs/head-noun-glossary.md +63 -0
- package/docs/images/audit-phases.png +0 -0
- package/docs/images/drift-states.png +0 -0
- package/docs/images/graded-mode.png +0 -0
- package/docs/images/manifest-pipeline.png +0 -0
- package/docs/images/routing-harness.png +0 -0
- package/docs/images/skill-anatomy.png +0 -0
- package/docs/images/starter-graph.png +0 -0
- package/docs/images/system-model.png +0 -0
- package/docs/integrations/github-actions.md +155 -0
- package/docs/manifest-field-mapping.md +443 -0
- package/docs/marketplace-publication-queue.generated.md +240 -0
- package/docs/marketplace-release-agent-prompt.md +82 -0
- package/docs/marketplace-skill-candidate-list.md +272 -0
- package/docs/marketplace-syndication.md +222 -0
- package/docs/migration-sample-review.md +155 -0
- package/docs/migrations/v4-to-v5.md +168 -0
- package/docs/migrations/v5-to-v6.md +221 -0
- package/docs/name-exceptions.yaml +37 -0
- package/docs/plans/marketplace-p1-public-migration-plan.md +41 -0
- package/docs/plans/multi-root-workspace.md +148 -0
- package/docs/plans/scripts-roadmap.md +107 -0
- package/docs/plans/v4-schema-bump.md +160 -0
- package/docs/plans/wave-2-extraction.md +122 -0
- package/docs/positioning-vs-marketplaces.md +175 -0
- package/docs/proposals/skill-audit-loop-positioning.md +160 -0
- package/docs/quality-doctrine.md +138 -0
- package/docs/recommended-skills.md +150 -0
- package/docs/research/skill-comprehension-eval-research.md +1830 -0
- package/docs/research/skill-retrieval-evidence.md +66 -0
- package/docs/skill-metadata-protocol.md +471 -0
- package/docs/skills-sh-maintainer-cleanup-request.md +80 -0
- package/examples/audits/a11y/findings.md +52 -0
- package/examples/audits/a11y/scorecard.md +21 -0
- package/examples/audits/a11y/verdict.md +44 -0
- package/examples/audits/debugging/findings.md +59 -0
- package/examples/audits/debugging/scorecard.md +22 -0
- package/examples/audits/debugging/verdict.md +33 -0
- package/examples/audits/documentation/findings.md +59 -0
- package/examples/audits/documentation/scorecard.md +22 -0
- package/examples/audits/documentation/verdict.md +33 -0
- package/examples/evals/a11y.json +140 -0
- package/examples/evals/api-design.json +52 -0
- package/examples/evals/code-review.json +52 -0
- package/examples/evals/data-modeling.json +52 -0
- package/examples/evals/database-migration.json +52 -0
- package/examples/evals/debugging.json +118 -0
- package/examples/evals/dependency-architecture.json +52 -0
- package/examples/evals/design-system-architecture.json +52 -0
- package/examples/evals/error-tracking.json +52 -0
- package/examples/evals/event-contract-design.json +52 -0
- package/examples/evals/form-ux-architecture.json +52 -0
- package/examples/evals/framework-fit-analysis.json +52 -0
- package/examples/evals/graph-audit.json +139 -0
- package/examples/evals/information-architecture.json +52 -0
- package/examples/evals/interaction-feedback.json +52 -0
- package/examples/evals/interaction-patterns.json +52 -0
- package/examples/evals/layout-composition.json +52 -0
- package/examples/evals/lint-overlay.json +117 -0
- package/examples/evals/microcopy.json +52 -0
- package/examples/evals/observability-modeling.json +52 -0
- package/examples/evals/pattern-recognition.json +96 -0
- package/examples/evals/performance-engineering.json +52 -0
- package/examples/evals/refactor.json +128 -0
- package/examples/evals/semiotics.json +52 -0
- package/examples/evals/skill-infrastructure.json +96 -0
- package/examples/evals/skill-router.json +140 -0
- package/examples/evals/skill-router.routing.json +113 -0
- package/examples/evals/system-interface-contracts.json +52 -0
- package/examples/evals/task-analysis.json +52 -0
- package/examples/evals/testing-strategy.json +118 -0
- package/examples/evals/type-safety.json +249 -0
- package/examples/evals/visual-design-foundations.json +52 -0
- package/examples/evals/webhook-integration.json +52 -0
- package/examples/exports/a11y.skill-md.md +80 -0
- package/examples/exports/debugging.skill-md.md +80 -0
- package/examples/exports/refactor.skill-md.md +78 -0
- package/examples/exports/testing-strategy.skill-md.md +81 -0
- package/examples/projects/markdown-static-site/README.md +115 -0
- package/examples/projects/markdown-static-site/skills/content-source-router/SKILL.md +131 -0
- package/examples/projects/markdown-static-site/skills/image-optimization-pipeline-config/SKILL.md +132 -0
- package/examples/projects/markdown-static-site/skills/link-rot-detection/SKILL.md +103 -0
- package/examples/projects/markdown-static-site/skills/markdown-post-frontmatter-validation/SKILL.md +133 -0
- package/examples/projects/markdown-static-site/skills/migrate-posts-to-v2-frontmatter/SKILL.md +140 -0
- package/examples/projects/saas-stripe-postgres/README.md +208 -0
- package/examples/projects/saas-stripe-postgres/db/migrations/0004_canonicalize_orders.sql +37 -0
- package/examples/projects/saas-stripe-postgres/db/schema.sql +112 -0
- package/examples/projects/saas-stripe-postgres/skills/migrate-orders-to-canonical-schema/SKILL.md +149 -0
- package/examples/projects/saas-stripe-postgres/skills/nextjs-server-action-validation/SKILL.md +154 -0
- package/examples/projects/saas-stripe-postgres/skills/payment-provider-router/SKILL.md +153 -0
- package/examples/projects/saas-stripe-postgres/skills/postgres-rls-pattern/SKILL.md +163 -0
- package/examples/projects/saas-stripe-postgres/skills/stripe-webhook-signature-verification/SKILL.md +137 -0
- package/examples/protocol/skill-metadata-template.md +301 -0
- package/examples/protocol/skills.manifest.sample.json +13245 -0
- package/examples/skill-metadata-template.md +317 -0
- package/examples/skills.manifest.sample.json +13519 -0
- package/examples/tests/v3-1-skos-fixture/SKILL.md +93 -0
- package/marketplace/README.md +17 -0
- package/marketplace/skills/a11y/SKILL.md +66 -0
- package/marketplace/skills/acid-fundamentals/SKILL.md +106 -0
- package/marketplace/skills/agent-engineering/SKILL.md +386 -0
- package/marketplace/skills/agent-eval-design/SKILL.md +55 -0
- package/marketplace/skills/ai-native-development/SKILL.md +294 -0
- package/marketplace/skills/api-design/SKILL.md +60 -0
- package/marketplace/skills/architecture-decision-records/SKILL.md +55 -0
- package/marketplace/skills/background-jobs/SKILL.md +265 -0
- package/marketplace/skills/bounded-context-mapping/SKILL.md +55 -0
- package/marketplace/skills/cap-theorem-tradeoffs/SKILL.md +127 -0
- package/marketplace/skills/client-server-boundary/SKILL.md +187 -0
- package/marketplace/skills/code-review/SKILL.md +120 -0
- package/marketplace/skills/color-system-design/SKILL.md +43 -0
- package/marketplace/skills/component-architecture/SKILL.md +126 -0
- package/marketplace/skills/compression/SKILL.md +112 -0
- package/marketplace/skills/conceptual-modeling/SKILL.md +181 -0
- package/marketplace/skills/connection-pooling/SKILL.md +105 -0
- package/marketplace/skills/constraint-awareness/SKILL.md +287 -0
- package/marketplace/skills/content-monitor/SKILL.md +209 -0
- package/marketplace/skills/context-engineering/SKILL.md +320 -0
- package/marketplace/skills/context-graph/SKILL.md +174 -0
- package/marketplace/skills/context-management/SKILL.md +174 -0
- package/marketplace/skills/context-window/SKILL.md +239 -0
- package/marketplace/skills/contract-testing/SKILL.md +120 -0
- package/marketplace/skills/cron-scheduling/SKILL.md +223 -0
- package/marketplace/skills/dark-mode-implementation/SKILL.md +47 -0
- package/marketplace/skills/data-modeling/SKILL.md +59 -0
- package/marketplace/skills/data-modeling-fundamentals/SKILL.md +117 -0
- package/marketplace/skills/database-migration/SKILL.md +429 -0
- package/marketplace/skills/debugging/SKILL.md +67 -0
- package/marketplace/skills/dependency-architecture/SKILL.md +58 -0
- package/marketplace/skills/design-module-composition/SKILL.md +43 -0
- package/marketplace/skills/design-system-architecture/SKILL.md +61 -0
- package/marketplace/skills/design-thinking/SKILL.md +44 -0
- package/marketplace/skills/diagnosis/SKILL.md +296 -0
- package/marketplace/skills/diff-analysis/SKILL.md +188 -0
- package/marketplace/skills/e2e-test-design/SKILL.md +113 -0
- package/marketplace/skills/entity-relationship-modeling/SKILL.md +218 -0
- package/marketplace/skills/epistemic-grounding/SKILL.md +112 -0
- package/marketplace/skills/error-boundary/SKILL.md +235 -0
- package/marketplace/skills/error-tracking/SKILL.md +261 -0
- package/marketplace/skills/eval-driven-development/SKILL.md +147 -0
- package/marketplace/skills/evaluation/SKILL.md +113 -0
- package/marketplace/skills/event-contract-design/SKILL.md +60 -0
- package/marketplace/skills/event-storming/SKILL.md +56 -0
- package/marketplace/skills/form-ux-architecture/SKILL.md +60 -0
- package/marketplace/skills/framework-fit-analysis/SKILL.md +59 -0
- package/marketplace/skills/frontend-architecture/SKILL.md +43 -0
- package/marketplace/skills/generative-ui/SKILL.md +118 -0
- package/marketplace/skills/graph-audit/SKILL.md +81 -0
- package/marketplace/skills/guardrails/SKILL.md +118 -0
- package/marketplace/skills/hooks-patterns/SKILL.md +185 -0
- package/marketplace/skills/http-semantics/SKILL.md +136 -0
- package/marketplace/skills/ideation/SKILL.md +41 -0
- package/marketplace/skills/indexing-strategy/SKILL.md +108 -0
- package/marketplace/skills/information-architecture/SKILL.md +59 -0
- package/marketplace/skills/integration-test-design/SKILL.md +111 -0
- package/marketplace/skills/intent-recognition/SKILL.md +136 -0
- package/marketplace/skills/interaction-feedback/SKILL.md +59 -0
- package/marketplace/skills/interaction-patterns/SKILL.md +59 -0
- package/marketplace/skills/journey-mapping/SKILL.md +41 -0
- package/marketplace/skills/keywords/SKILL.md +213 -0
- package/marketplace/skills/knowledge-modeling/SKILL.md +232 -0
- package/marketplace/skills/layout-composition/SKILL.md +59 -0
- package/marketplace/skills/linguistics/SKILL.md +429 -0
- package/marketplace/skills/lint-overlay/SKILL.md +76 -0
- package/marketplace/skills/mental-models/SKILL.md +126 -0
- package/marketplace/skills/merge-queue/SKILL.md +94 -0
- package/marketplace/skills/methodology/SKILL.md +317 -0
- package/marketplace/skills/microcopy/SKILL.md +232 -0
- package/marketplace/skills/middleware-patterns/SKILL.md +363 -0
- package/marketplace/skills/mobile-responsive-ux/SKILL.md +287 -0
- package/marketplace/skills/mutation-testing/SKILL.md +112 -0
- package/marketplace/skills/naming-conventions/SKILL.md +112 -0
- package/marketplace/skills/observability-modeling/SKILL.md +59 -0
- package/marketplace/skills/ontology-modeling/SKILL.md +67 -0
- package/marketplace/skills/owasp-security/SKILL.md +153 -0
- package/marketplace/skills/pattern-recognition/SKILL.md +472 -0
- package/marketplace/skills/performance-budgets/SKILL.md +185 -0
- package/marketplace/skills/performance-engineering/SKILL.md +58 -0
- package/marketplace/skills/performance-testing/SKILL.md +125 -0
- package/marketplace/skills/printify/SKILL.md +42 -0
- package/marketplace/skills/prioritization/SKILL.md +118 -0
- package/marketplace/skills/problem-framing/SKILL.md +41 -0
- package/marketplace/skills/problem-locating-solving/SKILL.md +203 -0
- package/marketplace/skills/project-knowledge-extraction/SKILL.md +54 -0
- package/marketplace/skills/prompt-craft/SKILL.md +134 -0
- package/marketplace/skills/prompt-injection-defense/SKILL.md +132 -0
- package/marketplace/skills/property-based-testing/SKILL.md +100 -0
- package/marketplace/skills/prototyping/SKILL.md +43 -0
- package/marketplace/skills/query-optimization/SKILL.md +144 -0
- package/marketplace/skills/real-time-updates/SKILL.md +324 -0
- package/marketplace/skills/ref-patterns/SKILL.md +284 -0
- package/marketplace/skills/refactor/SKILL.md +65 -0
- package/marketplace/skills/rendering-models/SKILL.md +142 -0
- package/marketplace/skills/replication-patterns/SKILL.md +110 -0
- package/marketplace/skills/research-synthesis/SKILL.md +41 -0
- package/marketplace/skills/route-handler-design/SKILL.md +347 -0
- package/marketplace/skills/schema-evolution/SKILL.md +140 -0
- package/marketplace/skills/security-fundamentals/SKILL.md +139 -0
- package/marketplace/skills/semantic-center/SKILL.md +194 -0
- package/marketplace/skills/semantic-relations/SKILL.md +250 -0
- package/marketplace/skills/semantics/SKILL.md +366 -0
- package/marketplace/skills/semiotics/SKILL.md +230 -0
- package/marketplace/skills/seo-strategy/SKILL.md +260 -0
- package/marketplace/skills/server-actions-design/SKILL.md +243 -0
- package/marketplace/skills/server-components-design/SKILL.md +190 -0
- package/marketplace/skills/sharding-strategy/SKILL.md +123 -0
- package/marketplace/skills/shopify/SKILL.md +42 -0
- package/marketplace/skills/skill-infrastructure/SKILL.md +320 -0
- package/marketplace/skills/skill-router/SKILL.md +71 -0
- package/marketplace/skills/skill-scaffold/SKILL.md +105 -0
- package/marketplace/skills/snapshot-testing/SKILL.md +120 -0
- package/marketplace/skills/spec-driven-development/SKILL.md +148 -0
- package/marketplace/skills/state-machine-modeling/SKILL.md +56 -0
- package/marketplace/skills/state-management/SKILL.md +134 -0
- package/marketplace/skills/streaming-architecture/SKILL.md +194 -0
- package/marketplace/skills/summarization/SKILL.md +156 -0
- package/marketplace/skills/suspense-patterns/SKILL.md +265 -0
- package/marketplace/skills/system-interface-contracts/SKILL.md +59 -0
- package/marketplace/skills/task-analysis/SKILL.md +201 -0
- package/marketplace/skills/taxonomy-design/SKILL.md +66 -0
- package/marketplace/skills/test-coverage-strategy/SKILL.md +108 -0
- package/marketplace/skills/test-doubles-design/SKILL.md +98 -0
- package/marketplace/skills/test-driven-development/SKILL.md +96 -0
- package/marketplace/skills/testing-strategy/SKILL.md +67 -0
- package/marketplace/skills/theme-system-design/SKILL.md +43 -0
- package/marketplace/skills/tool-call-flow/SKILL.md +229 -0
- package/marketplace/skills/tool-call-strategy/SKILL.md +292 -0
- package/marketplace/skills/transaction-isolation/SKILL.md +98 -0
- package/marketplace/skills/type-safety/SKILL.md +177 -0
- package/marketplace/skills/typography-system/SKILL.md +43 -0
- package/marketplace/skills/usability-testing/SKILL.md +43 -0
- package/marketplace/skills/user-research/SKILL.md +43 -0
- package/marketplace/skills/vercel-composition-patterns/SKILL.md +157 -0
- package/marketplace/skills/version-control/SKILL.md +233 -0
- package/marketplace/skills/visual-design-foundations/SKILL.md +59 -0
- package/marketplace/skills/visual-hierarchy/SKILL.md +43 -0
- package/marketplace/skills/webhook-integration/SKILL.md +331 -0
- package/marketplace/skills/writing-humanizer/SKILL.md +380 -0
- package/package.json +67 -0
- package/schemas/manifest.schema.json +811 -0
- package/schemas/manifest.v2.schema.json +164 -0
- package/schemas/manifest.v3.schema.json +758 -0
- package/schemas/manifest.v4.schema.json +755 -0
- package/schemas/manifest.v5.schema.json +755 -0
- package/schemas/manifest.v6.schema.json +811 -0
- package/schemas/skill.context.jsonld +279 -0
- package/schemas/skill.schema.json +919 -0
- package/schemas/skill.v2.schema.json +201 -0
- package/schemas/skill.v3.schema.json +827 -0
- package/schemas/skill.v4.schema.json +822 -0
- package/schemas/skill.v5.schema.json +830 -0
- package/schemas/skill.v6.schema.json +946 -0
- package/schemas/vocabulary/keywords.json +180 -0
- package/schemas/vocabulary/workspace_tags.json +23 -0
- package/scripts/__tests__/migrate-skill-v2-to-v3.test.js +161 -0
- package/scripts/__tests__/migrate-skill-v3-to-v4.test.js +158 -0
- package/scripts/__tests__/test-export-parser-drift.js +149 -0
- package/scripts/__tests__/test-marketplace-export.js +114 -0
- package/scripts/__tests__/test-router-paths.js +82 -0
- package/scripts/__tests__/test-stability-promotion.js +244 -0
- package/scripts/__tests__/test-v3-1-alias-contract.js +109 -0
- package/scripts/__tests__/test-v3-1-skos-runtime.js +116 -0
- package/scripts/backfill-schema-version.js +198 -0
- package/scripts/build-field-reference.js +160 -0
- package/scripts/build-retrieval-baseline.js +511 -0
- package/scripts/check-markdown-links.js +211 -0
- package/scripts/check-protocol-consistency.js +979 -0
- package/scripts/export-marketplace-skills.js +610 -0
- package/scripts/export-skill.js +374 -0
- package/scripts/generate-manifest.js +787 -0
- package/scripts/lib/alias-contract.js +83 -0
- package/scripts/lib/audit-prompt-builder.js +771 -0
- package/scripts/lib/mock-grader.js +134 -0
- package/scripts/lib/parse-frontmatter.js +429 -0
- package/scripts/lib/roots.js +119 -0
- package/scripts/lint/check-archetype-sections.js +185 -0
- package/scripts/lint/check-category-enum.js +83 -0
- package/scripts/lint/check-routing-eval.js +146 -0
- package/scripts/lint/check-routing-quality.js +211 -0
- package/scripts/lint/check-stability-promotion.js +220 -0
- package/scripts/lint/format-code-frame.js +206 -0
- package/scripts/marketplace-install.js +125 -0
- package/scripts/migrate-category-to-enum.js +169 -0
- package/scripts/migrate-skill-v2-to-v3.js +424 -0
- package/scripts/migrate-skill-v3-to-v4.js +200 -0
- package/scripts/migrate-skill-v5-to-v6.js +304 -0
- package/scripts/restructure-by-category.js +85 -0
- package/scripts/seed-publication-classification.js +282 -0
- package/scripts/skill-audit.js +893 -0
- package/scripts/skill-graph-drift.js +483 -0
- package/scripts/skill-graph-route.js +766 -0
- package/scripts/skill-graph-routing-eval.js +393 -0
- package/scripts/skill-lint.js +1317 -0
- package/scripts/skill-overlap.js +213 -0
- 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 };
|