agentlinkops 0.6.11 → 0.6.16
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/.claude-plugin/plugin.json +2 -2
- package/.codex-plugin/plugin.json +2 -2
- package/.mcp.json +0 -0
- package/CHANGELOG.md +35 -0
- package/LICENSE +0 -0
- package/NOTICE +0 -0
- package/PACK-ARTIFACT.json +16 -0
- package/PACKS.json +591 -0
- package/README.md +34 -48
- package/bin/agentlinkops.mjs +0 -0
- package/bin/linktrail.mjs +0 -0
- package/cli/adapters/csv.js +0 -0
- package/cli/adapters/sqlite-crm.js +0 -0
- package/cli/adapters/suppliers.js +1 -1
- package/cli/admission.js +0 -0
- package/cli/agent-setup.js +101 -17
- package/cli/agentlinkops.mjs +0 -0
- package/cli/args.js +0 -0
- package/cli/campaign-bridge.js +325 -0
- package/cli/campaign-outcomes.js +107 -0
- package/cli/catalog.js +47686 -16398
- package/cli/check.js +40 -10
- package/cli/chronology.js +39 -0
- package/cli/citation.js +0 -0
- package/cli/client.js +2 -1
- package/cli/cloud-error.js +0 -0
- package/cli/commands.js +17 -8
- package/cli/config.js +0 -0
- package/cli/connection.js +92 -18
- package/cli/contact-adoption.js +91 -0
- package/cli/context-mcp.js +0 -0
- package/cli/context.js +13 -2
- package/cli/delivery.js +0 -0
- package/cli/disavow.js +0 -0
- package/cli/doctor.js +15 -4
- package/cli/env.js +0 -0
- package/cli/fleet.js +30 -19
- package/cli/gsc-browser.js +0 -0
- package/cli/import.js +7 -1
- package/cli/index-observations.js +0 -0
- package/cli/index-submissions.js +0 -0
- package/cli/key-store.js +115 -0
- package/cli/ledger.js +1 -0
- package/cli/lifecycle.js +0 -0
- package/cli/linktrail.mjs +0 -0
- package/cli/local-result.js +41 -6
- package/cli/main.js +85 -20
- package/cli/mcp-client.js +2 -2
- package/cli/migration.js +308 -0
- package/cli/mirror.js +0 -0
- package/cli/mix.js +0 -0
- package/cli/native-lock.js +0 -0
- package/cli/oauth-credentials.js +0 -0
- package/cli/oauth-flow.js +0 -0
- package/cli/placement-projection.js +106 -0
- package/cli/platforms.js +0 -0
- package/cli/prompt.js +25 -0
- package/cli/public-http.js +168 -0
- package/cli/receipt-performance.js +0 -0
- package/cli/receipts.js +0 -0
- package/cli/report.js +51 -19
- package/cli/setup-plan.js +0 -0
- package/cli/skill.js +0 -0
- package/cli/state.js +76 -29
- package/cli/status.js +14 -18
- package/cli/sync-lock.js +0 -0
- package/cli/sync.js +23 -4
- package/package.json +7 -8
- package/references/citation-panels.md +2 -0
- package/references/cli.md +2 -2
- package/references/disavow.md +1 -1
- package/references/discovery-handoff.md +1 -1
- package/references/local-crm-draft-handoff.md +1 -1
- package/references/portable-ledger-handoff.md +11 -10
- package/references/recipes/catalog.json +263 -7
- package/references/recipes/command-notes.md +5 -3
- package/references/recipes/internal-link-improvement.md +25 -0
- package/references/recipes/placement-reconciliation.md +53 -1
- package/references/recipes/qualified-campaign-handoff.md +0 -0
- package/references/recipes/site-context-brief.md +0 -0
- package/references/recipes/sourced-linkable-asset.md +0 -0
- package/references/reports.md +0 -0
- package/scripts/agentlinkops.py +0 -0
- package/scripts/disavow.py +0 -0
- package/scripts/linktrail.py +0 -0
- package/scripts/migrations/001_crm.sql +0 -0
- package/scripts/migrations/002_cloud_events.sql +0 -0
- package/scripts/migrations/003_disavow.sql +0 -0
- package/scripts/migrations/004_placement_costs.sql +0 -0
- package/scripts/outreach-crm-draft.py +0 -0
- package/scripts/portable-handoff.py +17 -4
- package/scripts/report.py +0 -0
- package/shared/admission-contract.js +3 -2
- package/shared/admission-report-contract.js +3 -2
- package/shared/agent-clients.js +0 -0
- package/shared/analytics-history-contract.js +15 -0
- package/shared/campaign-outcome-contract.js +12 -0
- package/shared/campaign-prospect-contract.js +23 -0
- package/shared/citation-evidence-contract.js +0 -0
- package/shared/classification-contract.js +54 -0
- package/shared/contact-record-contract.js +27 -0
- package/shared/disavow-contract.js +37 -9
- package/shared/exec-grammar.js +0 -0
- package/shared/index-observation-contract.js +5 -4
- package/shared/internal-links-contract.js +143 -0
- package/shared/lifecycle-contract.js +0 -0
- package/shared/lifecycle-money.js +0 -0
- package/shared/link-category-contract.js +35 -0
- package/shared/link-category.js +138 -0
- package/shared/link-labels.js +26 -0
- package/shared/link-summary-contract.js +17 -0
- package/shared/monitoring-chronology-export.js +57 -0
- package/shared/monitoring-read-contract.js +41 -0
- package/shared/observation-event.js +1 -1
- package/shared/onboarding.js +20 -0
- package/shared/opportunity-record.js +0 -0
- package/shared/response-contract.js +41 -5
- package/shared/search-connection-contract.js +2 -1
- package/shared/table-page-contract.js +13 -0
- package/skills/agentlinkops-assets/SKILL-DEPS.json +290 -0
- package/skills/agentlinkops-assets/SKILL.md +3 -1
- package/skills/agentlinkops-assets/agents/openai.yaml +1 -1
- package/skills/agentlinkops-assets/references/portable/references/cli.md +220 -0
- package/skills/agentlinkops-assets/references/portable/references/disavow.md +73 -0
- package/skills/agentlinkops-assets/references/portable/references/reports.md +53 -0
- package/skills/agentlinkops-assets/references/portable/scripts/agentlinkops.py +676 -0
- package/skills/agentlinkops-assets/references/portable/scripts/disavow.py +207 -0
- package/skills/agentlinkops-assets/references/portable/scripts/migrations/001_crm.sql +45 -0
- package/skills/agentlinkops-assets/references/portable/scripts/migrations/002_cloud_events.sql +13 -0
- package/skills/agentlinkops-assets/references/portable/scripts/migrations/003_disavow.sql +20 -0
- package/skills/agentlinkops-assets/references/portable/scripts/migrations/004_placement_costs.sql +2 -0
- package/skills/agentlinkops-assets/references/portable/scripts/report.py +113 -0
- package/skills/agentlinkops-assets/references/portable/templates/campaigns.v1.json +65 -0
- package/skills/agentlinkops-campaigns/SKILL-DEPS.json +336 -0
- package/skills/agentlinkops-campaigns/SKILL.md +7 -5
- package/skills/agentlinkops-campaigns/agents/openai.yaml +1 -1
- package/skills/agentlinkops-campaigns/references/first-campaign.md +31 -0
- package/skills/agentlinkops-campaigns/references/mailbox-campaign.md +46 -0
- package/skills/agentlinkops-campaigns/references/portable/references/cli.md +220 -0
- package/skills/agentlinkops-campaigns/references/portable/references/disavow.md +73 -0
- package/skills/agentlinkops-campaigns/references/portable/references/reports.md +53 -0
- package/skills/agentlinkops-campaigns/references/portable/scripts/agentlinkops.py +676 -0
- package/skills/agentlinkops-campaigns/references/portable/scripts/disavow.py +207 -0
- package/skills/agentlinkops-campaigns/references/portable/scripts/migrations/001_crm.sql +45 -0
- package/skills/agentlinkops-campaigns/references/portable/scripts/migrations/002_cloud_events.sql +13 -0
- package/skills/agentlinkops-campaigns/references/portable/scripts/migrations/003_disavow.sql +20 -0
- package/skills/agentlinkops-campaigns/references/portable/scripts/migrations/004_placement_costs.sql +2 -0
- package/skills/agentlinkops-campaigns/references/portable/scripts/report.py +113 -0
- package/skills/agentlinkops-campaigns/references/portable/templates/campaigns.v1.json +65 -0
- package/skills/agentlinkops-connect/SKILL-DEPS.json +104 -0
- package/skills/agentlinkops-connect/SKILL.md +2 -0
- package/skills/agentlinkops-connect/agents/openai.yaml +1 -1
- package/skills/agentlinkops-connect/references/agentlinkops.md +164 -61
- package/skills/agentlinkops-connect/references/placement-workflows.md +19 -0
- package/skills/agentlinkops-crm/SKILL-DEPS.json +381 -0
- package/skills/agentlinkops-crm/SKILL.md +26 -9
- package/skills/agentlinkops-crm/agents/openai.yaml +1 -1
- package/skills/agentlinkops-crm/references/portable/references/cli.md +220 -0
- package/skills/agentlinkops-crm/references/portable/references/disavow.md +73 -0
- package/skills/agentlinkops-crm/references/portable/references/local-crm-draft-handoff.md +76 -0
- package/skills/agentlinkops-crm/references/portable/references/portable-ledger-handoff.md +51 -0
- package/skills/agentlinkops-crm/references/portable/references/reports.md +53 -0
- package/skills/agentlinkops-crm/references/portable/scripts/agentlinkops.py +676 -0
- package/skills/agentlinkops-crm/references/portable/scripts/disavow.py +207 -0
- package/skills/agentlinkops-crm/references/portable/scripts/migrations/001_crm.sql +45 -0
- package/skills/agentlinkops-crm/references/portable/scripts/migrations/002_cloud_events.sql +13 -0
- package/skills/agentlinkops-crm/references/portable/scripts/migrations/003_disavow.sql +20 -0
- package/skills/agentlinkops-crm/references/portable/scripts/migrations/004_placement_costs.sql +2 -0
- package/skills/agentlinkops-crm/references/portable/scripts/outreach-crm-draft.py +121 -0
- package/skills/agentlinkops-crm/references/portable/scripts/portable-handoff.py +197 -0
- package/skills/agentlinkops-crm/references/portable/scripts/report.py +113 -0
- package/skills/agentlinkops-crm/references/portable/templates/campaigns.v1.json +65 -0
- package/skills/agentlinkops-discovery/SKILL-DEPS.json +301 -0
- package/skills/agentlinkops-discovery/SKILL.md +4 -2
- package/skills/agentlinkops-discovery/references/portable/references/cli.md +220 -0
- package/skills/agentlinkops-discovery/references/portable/references/disavow.md +73 -0
- package/skills/agentlinkops-discovery/references/portable/references/discovery-handoff.md +32 -0
- package/skills/agentlinkops-discovery/references/portable/references/reports.md +53 -0
- package/skills/agentlinkops-discovery/references/portable/scripts/agentlinkops.py +676 -0
- package/skills/agentlinkops-discovery/references/portable/scripts/disavow.py +207 -0
- package/skills/agentlinkops-discovery/references/portable/scripts/migrations/001_crm.sql +45 -0
- package/skills/agentlinkops-discovery/references/portable/scripts/migrations/002_cloud_events.sql +13 -0
- package/skills/agentlinkops-discovery/references/portable/scripts/migrations/003_disavow.sql +20 -0
- package/skills/agentlinkops-discovery/references/portable/scripts/migrations/004_placement_costs.sql +2 -0
- package/skills/agentlinkops-discovery/references/portable/scripts/report.py +113 -0
- package/skills/agentlinkops-discovery/references/portable/templates/campaigns.v1.json +65 -0
- package/skills/agentlinkops-discovery/references/saved-backlink-workflows.md +23 -0
- package/src/citations/adapter.js +0 -0
- package/src/citations/alert.js +0 -0
- package/src/citations/browser/chatgpt-citations.js +0 -0
- package/src/citations/browser/engine.js +0 -0
- package/src/citations/browser/gen/core/providers/_shared/rawSourcesDom.js +0 -0
- package/src/citations/browser/gen/core/providers/_shared/resetProviderPage.js +0 -0
- package/src/citations/browser/gen/core/providers/_shared/sourceUtils.js +0 -0
- package/src/citations/browser/gen/core/providers/ai-overview/index.js +0 -0
- package/src/citations/browser/gen/core/providers/ai-overview/lib/expand.js +0 -0
- package/src/citations/browser/gen/core/providers/ai-overview/lib/extractSources.js +0 -0
- package/src/citations/browser/gen/core/providers/ai-overview/lib/pageLifecycle.js +0 -0
- package/src/citations/browser/gen/core/providers/ai-overview/lib/session.js +0 -0
- package/src/citations/browser/gen/core/providers/chatgpt/index.js +0 -0
- package/src/citations/browser/gen/core/providers/chatgpt/lib/dismissAuthModal.js +0 -0
- package/src/citations/browser/gen/core/providers/chatgpt/lib/extractSources.js +0 -0
- package/src/citations/browser/gen/core/providers/chatgpt/lib/pageLifecycle.js +0 -0
- package/src/citations/browser/gen/core/providers/claude/index.js +0 -0
- package/src/citations/browser/gen/core/providers/claude/lib/extractSources.js +0 -0
- package/src/citations/browser/gen/core/providers/claude/lib/pageLifecycle.js +0 -0
- package/src/citations/browser/gen/core/providers/gemini/index.js +0 -0
- package/src/citations/browser/gen/core/providers/gemini/lib/extractSources.js +0 -0
- package/src/citations/browser/gen/core/providers/gemini/lib/pageLifecycle.js +0 -0
- package/src/citations/browser/gen/core/providers/gemini/lib/session.js +0 -0
- package/src/citations/browser/gen/core/providers/index.js +0 -0
- package/src/citations/browser/gen/core/providers/perplexity/index.js +0 -0
- package/src/citations/browser/gen/core/providers/perplexity/lib/extractSources.js +0 -0
- package/src/citations/browser/gen/core/providers/perplexity/lib/navigation.js +0 -0
- package/src/citations/browser/gen/lib/browser/camoufox.js +0 -0
- package/src/citations/browser/gen/lib/browser/display.js +0 -0
- package/src/citations/browser/gen/lib/browser/domOps.js +0 -0
- package/src/citations/browser/gen/lib/browser/humanBehavior.js +0 -0
- package/src/citations/browser/gen/lib/browser/navigate.js +0 -0
- package/src/citations/browser/gen/lib/extraction/sourceUtils.js +0 -0
- package/src/citations/browser/gen/lib/input/editor/clearInput.js +0 -0
- package/src/citations/browser/gen/lib/input/editor/findEditor.js +0 -0
- package/src/citations/browser/gen/lib/input/editor/promptInput.js +0 -0
- package/src/citations/browser/gen/lib/input/markdown/converter.js +0 -0
- package/src/citations/browser/gen/lib/input/markdown/toMarkdown.js +0 -0
- package/src/citations/browser/gen/lib/input/response/detectBotPage.js +0 -0
- package/src/citations/browser/gen/lib/input/response/isGenerating.js +0 -0
- package/src/citations/browser/gen/lib/input/response/waitForFinish.js +0 -0
- package/src/citations/browser/gen/lib/input/sources/findButton.js +0 -0
- package/src/citations/browser/gen/lib/input/sources/openPanel.js +0 -0
- package/src/citations/browser/gen/utils/agent-constants.js +0 -0
- package/src/citations/browser/providers.js +0 -0
- package/src/citations/browser/proxy-admission.js +0 -0
- package/src/citations/browser/shims/errors.js +0 -0
- package/src/citations/browser/shims/types.js +0 -0
- package/src/citations/browser/shims/utils.js +0 -0
- package/src/citations/contract.js +0 -0
- package/src/citations/egress-receipts.js +0 -0
- package/src/citations/evidence-integrity.js +0 -0
- package/src/citations/inventory.js +0 -0
- package/src/citations/login.js +0 -0
- package/src/citations/match.js +0 -0
- package/src/citations/panel-builder.js +0 -0
- package/src/citations/report.js +0 -0
- package/src/citations/runner.js +0 -0
- package/src/citations/stats.js +0 -0
- package/src/citations/sync.js +0 -0
- package/src/citations/watch.js +0 -0
- package/src/competitors/contract.js +17 -1
- package/src/competitors/domain-mix.js +0 -0
- package/src/context/ga4.js +0 -0
- package/src/context/gsc.js +0 -0
- package/src/context/site-profile.js +34 -121
- package/src/context/util.js +0 -0
- package/src/context-tool-registry.js +0 -0
- package/src/corpus/acquire.js +68 -32
- package/src/corpus/extract.js +147 -0
- package/src/corpus/frontier.js +151 -0
- package/src/corpus/seeds.js +0 -0
- package/src/discovery/contract.js +8 -0
- package/src/discovery/import.js +13 -1
- package/src/evidence-reference.js +0 -0
- package/src/index-observation.js +0 -0
- package/src/locator.js +0 -0
- package/src/mentions.js +193 -0
- package/src/page-acquisition/acquire.js +50 -0
- package/src/page-acquisition/bytes.js +138 -0
- package/src/page-acquisition/capture.js +11 -0
- package/src/page-acquisition/contracts.js +67 -0
- package/src/page-acquisition/documents.js +166 -0
- package/src/page-acquisition/http.js +307 -0
- package/src/page-acquisition/policy.js +20 -0
- package/src/page-acquisition/recovery.js +164 -0
- package/src/page-acquisition/render-failure.js +82 -0
- package/src/page-extraction/html.js +359 -0
- package/src/page-extraction/index.js +30 -0
- package/src/page-extraction/metadata.js +16 -0
- package/src/response-shaping.js +4 -3
- package/src/tool-views.js +23 -12
- package/src/verifier/fetch.js +4 -339
- package/src/verifier/index.js +81 -23
- package/src/verifier/observation-kind.js +0 -0
- package/src/verifier/page-quality.js +14 -0
- package/src/verifier/parser.js +2 -241
- package/src/verifier/readiness.js +64 -13
- package/src/verifier/render-evidence.js +25 -2
- package/src/verifier/robots.js +0 -0
- package/src/verifier/target.js +201 -0
- package/src/verifier/transition.js +18 -3
- package/src/verifier/url.js +31 -0
- package/src/watch-crawlability.js +144 -0
- package/templates/SITE.template.md +0 -0
- package/templates/campaigns.v1.json +0 -0
- package/skills/content-defingerprinting/SKILL.md +0 -29
- package/skills/content-defingerprinting/scripts/watermarks/README.md +0 -102
- package/skills/content-defingerprinting/scripts/watermarks/UPSTREAM.json +0 -26
- package/skills/content-defingerprinting/scripts/watermarks/revendor.sh +0 -52
- package/skills/content-defingerprinting/scripts/watermarks/vendor/LICENSE.upstream +0 -21
- package/skills/content-defingerprinting/scripts/watermarks/vendor/clean_text.py +0 -96
- package/skills/content-defingerprinting/scripts/watermarks/vendor/common.py +0 -432
- package/skills/content-defingerprinting/scripts/watermarks/vendor/inspect_text.py +0 -86
- package/skills/content-defingerprinting/scripts/watermarks/vendor/score_stylometry.py +0 -460
- package/skills/content-defingerprinting/scripts/watermarks/vendor/text_unicode.py +0 -651
- package/skills/content-defingerprinting/scripts/watermarks/verify-vendor.py +0 -27
- package/skills/content-defingerprinting/scripts/watermarks/wm-scan.py +0 -212
- package/skills/internal-linking-optimizer/SKILL.md +0 -56
- package/skills/internal-linking-optimizer/references/source-prompt.md +0 -76
- package/skills/pre-publish-review/SKILL.md +0 -179
- package/skills/source-cited-content-builder/SKILL.md +0 -56
- package/skills/source-cited-content-builder/references/source-prompt.md +0 -19
- package/skills/source-cited-humanizer/SKILL.md +0 -20
|
@@ -1,212 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
"""Stage 2b of the content pipeline: invisible-Unicode / provenance-mark scan.
|
|
3
|
-
|
|
4
|
-
Wraps the vendored watermarks-remover Layer A engine (see UPSTREAM.json) and
|
|
5
|
-
reports every invisible or undisplayable character in the files you point it at,
|
|
6
|
-
with the line each one sits on.
|
|
7
|
-
|
|
8
|
-
wm-scan.py <path> [<path> ...] # report; exit 1 if anything is found
|
|
9
|
-
wm-scan.py --fix <path> [...] # clean in place, then re-verify
|
|
10
|
-
wm-scan.py --json <path> # machine-readable, for a gate
|
|
11
|
-
wm-scan.py --quiet <path> # exit code only
|
|
12
|
-
|
|
13
|
-
Exit codes: 0 = clean 1 = findings 2 = usage/read error
|
|
14
|
-
|
|
15
|
-
Why this is a required step and not a nicety: these characters are invisible in
|
|
16
|
-
every editor and every review, they survive copy-paste out of PDFs, Word and LLM
|
|
17
|
-
output, and they silently break the things that check our prose. A zero-width
|
|
18
|
-
space inside "affidavit" means the banned-phrase scan, the citation audits and
|
|
19
|
-
every grep in the repo stop seeing the word.
|
|
20
|
-
|
|
21
|
-
WHAT THIS DOES NOT DO, on purpose:
|
|
22
|
-
- It does not strip C2PA manifests. C2PA on one of our own generated covers is
|
|
23
|
-
a signal worth investigating, not noise worth deleting. Report it, ask why.
|
|
24
|
-
- It does not run Layer B (rewriting text to defeat statistical watermarks).
|
|
25
|
-
Our humanize stage already rewrites AI-pattern prose on quality grounds.
|
|
26
|
-
- It does not touch image pixels. Our covers are our own generated assets.
|
|
27
|
-
"""
|
|
28
|
-
from __future__ import annotations
|
|
29
|
-
|
|
30
|
-
import argparse
|
|
31
|
-
import io
|
|
32
|
-
import json
|
|
33
|
-
import os
|
|
34
|
-
import re
|
|
35
|
-
import sys
|
|
36
|
-
|
|
37
|
-
VENDOR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "vendor")
|
|
38
|
-
sys.path.insert(0, VENDOR)
|
|
39
|
-
try:
|
|
40
|
-
import text_unicode as tu
|
|
41
|
-
except ImportError: # pragma: no cover
|
|
42
|
-
sys.stderr.write("wm-scan: vendored engine missing at %s\n" % VENDOR)
|
|
43
|
-
sys.stderr.write(" re-run the kit install, or ./revendor.sh\n")
|
|
44
|
-
sys.exit(2)
|
|
45
|
-
|
|
46
|
-
# Fast pre-filter. The engine is thorough and therefore per-character, which is far
|
|
47
|
-
# too slow across a 14,000-file data tree. This regex is a deliberate SUPERSET of what
|
|
48
|
-
# the engine flags: anything it misses cannot be suspicious, and its false positives
|
|
49
|
-
# just fall through to the engine, which makes the real call. Without it a full scan of
|
|
50
|
-
# one sibling repo did not finish in two minutes; with it, seconds.
|
|
51
|
-
SUSPECT = re.compile(
|
|
52
|
-
"[\u00A0\u00AD\u034F\u061C\u115F\u1160\u17B4\u17B5\u180B-\u180E"
|
|
53
|
-
"\u2000-\u200F\u2028-\u202F\u205F-\u206F\u3000\u3164\uFE00-\uFE0F"
|
|
54
|
-
"\uFEFF\uFFA0\uFFF9-\uFFFB\uE000-\uF8FF]"
|
|
55
|
-
"|[\U000E0000-\U000E007F]|[\U000F0000-\U0010FFFD]"
|
|
56
|
-
)
|
|
57
|
-
|
|
58
|
-
TEXT_EXT = (".mdx", ".md", ".tsx", ".ts", ".jsx", ".js", ".json", ".html", ".css", ".txt", ".yaml", ".yml")
|
|
59
|
-
SKIP_DIRS = {".git", "node_modules", ".next", "out", ".contentlayer", "cache", ".venv", "__pycache__", "vendor"}
|
|
60
|
-
|
|
61
|
-
# Paths holding ARCHIVED SOURCE EVIDENCE: scraped snapshots, extracted policy PDFs,
|
|
62
|
-
# price history. --fix refuses to touch these, and it is not a configurable nicety.
|
|
63
|
-
# The marks in there are PDF glyph artifacts in a document somebody else published,
|
|
64
|
-
# and that archive is what every `_source` and `verified_quote` on the site resolves
|
|
65
|
-
# against. Rewriting it to make a scan pass is the tampering the provenance chain
|
|
66
|
-
# exists to detect: one edited file and one re-forged hash is the whole failure story.
|
|
67
|
-
# Report them, leave them, and treat any quote LIFTED from them as the thing to check.
|
|
68
|
-
ARCHIVE_MARKERS = ("/sources/", "/snapshots/", "/evidence/", "/_sources/", "/price-history/", "/raw/")
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
# LOAD-BEARING LITERALS. An invisible character sitting inside a regex character class
|
|
72
|
-
# is not contamination, it is the sanitizer that REMOVES contamination, written with the
|
|
73
|
-
# literal characters it strips. Three of these exist across the estate:
|
|
74
|
-
# .replace(/[<zwsp><zwnj><zwj><bom>]+/g, '') covered-weight EHB extractor
|
|
75
|
-
# .replace(/ | |<zwsp>/g, " ") proxy-compare proxyscrape
|
|
76
|
-
# .replace(/<nbsp>/g, " ") proxy-compare rayobyte
|
|
77
|
-
# Auto-fixing them empties the character class and silently breaks the sanitizer, letting
|
|
78
|
-
# through exactly the marks it existed to catch. High-precision guard: refuse when the
|
|
79
|
-
# hit's own line carries regex-replacement syntax.
|
|
80
|
-
LOAD_BEARING = re.compile(r"\.replace\s*\(|new\s+RegExp\(|/\[[^\]]*\]|\\u[0-9A-Fa-f]{4}")
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
def is_load_bearing(text, index):
|
|
84
|
-
start = text.rfind("\n", 0, index) + 1
|
|
85
|
-
end = text.find("\n", index)
|
|
86
|
-
line = text[start:] if end == -1 else text[start:end]
|
|
87
|
-
return bool(LOAD_BEARING.search(line))
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
def is_archive(path):
|
|
91
|
-
norm = "/" + path.replace(os.sep, "/").strip("/") + "/"
|
|
92
|
-
return any(marker in norm for marker in ARCHIVE_MARKERS)
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
def walk(paths):
|
|
96
|
-
for p in paths:
|
|
97
|
-
if os.path.isfile(p):
|
|
98
|
-
yield p
|
|
99
|
-
continue
|
|
100
|
-
for dirpath, dirnames, filenames in os.walk(p):
|
|
101
|
-
dirnames[:] = [d for d in dirnames if d not in SKIP_DIRS]
|
|
102
|
-
for f in sorted(filenames):
|
|
103
|
-
# AppleDouble shadows: these volumes are exFAT and every file has one
|
|
104
|
-
if f.startswith("._") or not f.endswith(TEXT_EXT):
|
|
105
|
-
continue
|
|
106
|
-
yield os.path.join(dirpath, f)
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
def line_of(text, index):
|
|
110
|
-
return text.count("\n", 0, index) + 1
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
def scan_file(path):
|
|
114
|
-
try:
|
|
115
|
-
text = io.open(path, encoding="utf-8").read()
|
|
116
|
-
except (UnicodeDecodeError, OSError):
|
|
117
|
-
return None
|
|
118
|
-
if not SUSPECT.search(text):
|
|
119
|
-
return None
|
|
120
|
-
report = tu.inspect_text(text)
|
|
121
|
-
if not report.suspicious_total:
|
|
122
|
-
return None
|
|
123
|
-
findings = []
|
|
124
|
-
load_bearing = False
|
|
125
|
-
for hit in report.hits:
|
|
126
|
-
if any(is_load_bearing(text, i) for i in hit.samples):
|
|
127
|
-
load_bearing = True
|
|
128
|
-
findings.append({
|
|
129
|
-
"codepoint": "U+%04X" % hit.codepoint,
|
|
130
|
-
"label": hit.label,
|
|
131
|
-
"kind": hit.kind,
|
|
132
|
-
"count": hit.count,
|
|
133
|
-
"lines": sorted({line_of(text, i) for i in hit.samples}),
|
|
134
|
-
})
|
|
135
|
-
return {"file": path, "total": report.suspicious_total,
|
|
136
|
-
"archive": is_archive(path), "load_bearing": load_bearing,
|
|
137
|
-
"findings": findings}
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
def main():
|
|
141
|
-
ap = argparse.ArgumentParser(description="Scan content for invisible Unicode / provenance marks.")
|
|
142
|
-
ap.add_argument("paths", nargs="+", help="Files or directories to scan")
|
|
143
|
-
ap.add_argument("--fix", action="store_true", help="Clean in place, then re-verify")
|
|
144
|
-
ap.add_argument("--json", action="store_true", help="Machine-readable output")
|
|
145
|
-
ap.add_argument("--quiet", action="store_true", help="Exit code only")
|
|
146
|
-
ap.add_argument("--keep-nbsp", action="store_true",
|
|
147
|
-
help="With --fix, leave no-break spaces alone (they are sometimes deliberate)")
|
|
148
|
-
args = ap.parse_args()
|
|
149
|
-
|
|
150
|
-
results, scanned = [], 0
|
|
151
|
-
for path in walk(args.paths):
|
|
152
|
-
scanned += 1
|
|
153
|
-
found = scan_file(path)
|
|
154
|
-
if found:
|
|
155
|
-
results.append(found)
|
|
156
|
-
|
|
157
|
-
if args.fix and results:
|
|
158
|
-
refused = [r["file"] for r in results if r["archive"]]
|
|
159
|
-
held = [r["file"] for r in results if r["load_bearing"] and not r["archive"]]
|
|
160
|
-
for result in results:
|
|
161
|
-
if result["archive"] or result["load_bearing"]:
|
|
162
|
-
continue
|
|
163
|
-
text = io.open(result["file"], encoding="utf-8").read()
|
|
164
|
-
cleaned, _stats = tu.clean_text(text, normalize_spaces=not args.keep_nbsp)
|
|
165
|
-
if cleaned != text:
|
|
166
|
-
io.open(result["file"], "w", encoding="utf-8").write(cleaned)
|
|
167
|
-
result["fixed"] = True
|
|
168
|
-
results = [r for r in (scan_file(x["file"]) for x in results) if r]
|
|
169
|
-
if refused and not args.json:
|
|
170
|
-
sys.stderr.write(
|
|
171
|
-
"\nwm-scan: REFUSED to fix %d archived source file(s).\n"
|
|
172
|
-
" That tree is the evidence every citation resolves against; the marks in it\n"
|
|
173
|
-
" belong to a document somebody else published. Check the QUOTES lifted from\n"
|
|
174
|
-
" it instead, and leave the archive byte-identical.\n" % len(refused))
|
|
175
|
-
for f in refused[:10]:
|
|
176
|
-
sys.stderr.write(" %s\n" % f)
|
|
177
|
-
if held and not args.json:
|
|
178
|
-
sys.stderr.write(
|
|
179
|
-
"\nwm-scan: HELD BACK %d file(s) whose marks look LOAD-BEARING.\n"
|
|
180
|
-
" The character sits on a line with regex-replacement syntax, which usually\n"
|
|
181
|
-
" means it IS the sanitizer that strips these marks, written literally.\n"
|
|
182
|
-
" Emptying that character class breaks the guard. Review by hand.\n" % len(held))
|
|
183
|
-
for f in held[:10]:
|
|
184
|
-
sys.stderr.write(" %s\n" % f)
|
|
185
|
-
|
|
186
|
-
if args.json:
|
|
187
|
-
json.dump({"scanned": scanned, "dirty": len(results), "results": results}, sys.stdout, indent=2)
|
|
188
|
-
sys.stdout.write("\n")
|
|
189
|
-
elif not args.quiet:
|
|
190
|
-
if not results:
|
|
191
|
-
print("wm-scan: %d files scanned, clean." % scanned)
|
|
192
|
-
else:
|
|
193
|
-
print("wm-scan: %d files scanned, %d carry invisible characters.\n" % (scanned, len(results)))
|
|
194
|
-
for result in results:
|
|
195
|
-
tag = ""
|
|
196
|
-
if result["archive"]:
|
|
197
|
-
tag = " [ARCHIVE - report only, never fix]"
|
|
198
|
-
elif result["load_bearing"]:
|
|
199
|
-
tag = " [LOAD-BEARING? regex literal on that line - review by hand]"
|
|
200
|
-
print(" %s%s" % (result["file"], tag))
|
|
201
|
-
for f in result["findings"]:
|
|
202
|
-
lines = ",".join(str(n) for n in f["lines"][:6])
|
|
203
|
-
print(" %-46s x%-3d [%s] line %s" % (f["label"], f["count"], f["kind"], lines))
|
|
204
|
-
print("\nFix with: wm-scan.py --fix <path>")
|
|
205
|
-
print("Then read the diff. A character inside a sourced quote is a provenance")
|
|
206
|
-
print("question before it is a formatting one: check it against the document.")
|
|
207
|
-
|
|
208
|
-
return 1 if results else 0
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
if __name__ == "__main__":
|
|
212
|
-
sys.exit(main())
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: internal-linking-optimizer
|
|
3
|
-
description: Audit content pages and add strategic internal links across TSX templates and MDX files. Use for internal linking, topical clusters, orphaned content, contextual links, SEO link strategy, or content network improvements.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Internal Linking Optimizer
|
|
7
|
-
|
|
8
|
-
Use this skill when adding internal links to existing content pages. This skill does not create new content pages.
|
|
9
|
-
|
|
10
|
-
## The orphan-page doctrine (the trap this skill exists to close)
|
|
11
|
-
|
|
12
|
-
A new page with zero inbound internal links is invisible: no authority flows in and
|
|
13
|
-
no user can reach it. This is the DEFAULT state of every new page, and it survives
|
|
14
|
-
every build gate. A broken-link audit only proves outbound links resolve; it cannot
|
|
15
|
-
tell you nothing links IN. After publishing any page, prove inbound links exist from
|
|
16
|
-
established pages:
|
|
17
|
-
|
|
18
|
-
```bash
|
|
19
|
-
# Must return at least one file that is NOT the page itself and NOT the sitemap.
|
|
20
|
-
# Run over your content roots (SITE.md).
|
|
21
|
-
grep -rl '"/<new-slug>/"' <your-content-roots> | grep -v "<new-slug>" | grep -v sitemap
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
If it returns nothing, the page is orphaned. Fix it by editing established, related
|
|
25
|
-
pages to link in (3+ inbound links is the working floor), not by waiting for it to
|
|
26
|
-
"get picked up".
|
|
27
|
-
|
|
28
|
-
## Workflow
|
|
29
|
-
|
|
30
|
-
1. Read `references/source-prompt.md` before changing files.
|
|
31
|
-
2. Scan content pages and separate them from application or functional pages.
|
|
32
|
-
3. Map topics, content relationships, orphaned pages, and content clusters.
|
|
33
|
-
4. Choose natural anchor text already present in the content when possible.
|
|
34
|
-
5. Add a conservative number of contextual links per page.
|
|
35
|
-
6. Verify destinations exist and links use the repo's expected relative path or routing pattern.
|
|
36
|
-
7. Report source page, destination page, anchor text, and reason for each link added.
|
|
37
|
-
|
|
38
|
-
## Linking heuristics
|
|
39
|
-
|
|
40
|
-
- 3-5 contextual links per content page is the working baseline; stay natural, not
|
|
41
|
-
quota-driven.
|
|
42
|
-
- Link bidirectionally between closely related pages; a one-way link between
|
|
43
|
-
siblings is usually half-done.
|
|
44
|
-
- Route authority downhill: link from high-authority pages to important but
|
|
45
|
-
lower-authority pages, not only the reverse.
|
|
46
|
-
- Prefer links in the main content body over sidebar/footer/nav slots; body links
|
|
47
|
-
carry the semantic signal.
|
|
48
|
-
- Build pillar-cluster shape: overview pages link to every variant page and each
|
|
49
|
-
variant links back.
|
|
50
|
-
|
|
51
|
-
## Guardrails
|
|
52
|
-
|
|
53
|
-
- Do not change application logic or functional components.
|
|
54
|
-
- Preserve existing content and valuable links.
|
|
55
|
-
- Use React or Next.js link patterns in TSX, and markdown or MDX link patterns in MDX.
|
|
56
|
-
- Avoid generic anchors and repeated identical anchors to the same destination.
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
internal linking
|
|
2
|
-
|
|
3
|
-
You are an expert SEO specialist and content strategist specializing in internal linking optimization. Your deep understanding of information architecture, user journey mapping, and search engine algorithms enables you to create powerful internal linking strategies that boost both user engagement and search rankings.
|
|
4
|
-
|
|
5
|
-
Your primary mission is to analyze content pages (excluding application/functional pages) and implement strategic internal links that create a robust content network. You work with both TSX templates with embedded content and MDX files.
|
|
6
|
-
|
|
7
|
-
**Core Responsibilities:**
|
|
8
|
-
|
|
9
|
-
1. **Content Analysis Phase:**
|
|
10
|
-
- Scan all content pages systematically, distinguishing between content pages and application pages
|
|
11
|
-
- Extract and analyze key topics, themes, and concepts from each page
|
|
12
|
-
- Identify content relationships and thematic clusters
|
|
13
|
-
- Map content hierarchy and topical relevance
|
|
14
|
-
- Note whether content is in TSX templates or MDX files
|
|
15
|
-
|
|
16
|
-
2. **Link Opportunity Identification:**
|
|
17
|
-
- Find natural anchor text opportunities within existing content
|
|
18
|
-
- Identify orphaned pages that lack internal links
|
|
19
|
-
- Detect content gaps where reciprocal linking would benefit users
|
|
20
|
-
- Prioritize high-value linking opportunities based on:
|
|
21
|
-
- Topical relevance (primary factor)
|
|
22
|
-
- User journey logic
|
|
23
|
-
- Content depth and authority
|
|
24
|
-
- Search intent alignment
|
|
25
|
-
|
|
26
|
-
3. **Implementation Strategy:**
|
|
27
|
-
- Create semantically meaningful anchor text that describes the destination
|
|
28
|
-
- Avoid generic anchors like 'click here' or 'read more'
|
|
29
|
-
- Implement 3-5 contextual links per content page as a baseline
|
|
30
|
-
- Ensure bidirectional linking between closely related topics
|
|
31
|
-
- Maintain natural link density without over-optimization
|
|
32
|
-
- Preserve existing valuable links while adding new ones
|
|
33
|
-
|
|
34
|
-
4. **Technical Implementation:**
|
|
35
|
-
- For TSX files: Add links using appropriate React/Next.js Link components
|
|
36
|
-
- For MDX files: Use markdown link syntax or MDX components as appropriate
|
|
37
|
-
- Ensure all internal links use relative paths
|
|
38
|
-
- Maintain consistent link formatting across the site
|
|
39
|
-
- Verify link destinations exist and are accessible
|
|
40
|
-
|
|
41
|
-
5. **Best Practices You Follow:**
|
|
42
|
-
- Link from high-authority pages to important but lower-authority pages
|
|
43
|
-
- Create topic clusters with pillar pages and supporting content
|
|
44
|
-
- Use descriptive, keyword-rich (but natural) anchor text
|
|
45
|
-
- Distribute links throughout content, not just in navigation
|
|
46
|
-
- Prioritize links in the main content body over sidebar/footer links
|
|
47
|
-
- Avoid linking to the same page multiple times with identical anchors
|
|
48
|
-
- Consider user intent and logical next steps in the user journey
|
|
49
|
-
|
|
50
|
-
6. **Quality Assurance:**
|
|
51
|
-
- Verify all links resolve correctly
|
|
52
|
-
- Ensure anchor text accurately represents destination content
|
|
53
|
-
- Check for broken link patterns or circular linking issues
|
|
54
|
-
- Validate that link additions maintain content readability
|
|
55
|
-
- Confirm compliance with accessibility standards (descriptive link text)
|
|
56
|
-
|
|
57
|
-
**Output Approach:**
|
|
58
|
-
|
|
59
|
-
When implementing changes:
|
|
60
|
-
1. First provide a brief analysis of linking opportunities discovered
|
|
61
|
-
2. List the specific links you're adding, including:
|
|
62
|
-
- Source page
|
|
63
|
-
- Destination page
|
|
64
|
-
- Anchor text used
|
|
65
|
-
- Rationale for the link
|
|
66
|
-
3. Edit files directly to implement the links
|
|
67
|
-
4. Summarize the improvements made and expected benefits
|
|
68
|
-
|
|
69
|
-
**Important Constraints:**
|
|
70
|
-
- Never create new content pages; only add links to existing content
|
|
71
|
-
- Don't modify application logic or functional components
|
|
72
|
-
- Preserve all existing content while adding links
|
|
73
|
-
- Avoid over-optimization that could appear manipulative
|
|
74
|
-
- Respect any existing link attributes (nofollow, sponsored, etc.)
|
|
75
|
-
|
|
76
|
-
You approach each task methodically, ensuring that every internal link you add serves both user navigation and SEO purposes. Your work creates a web of interconnected content that guides users naturally through related topics while signaling content relationships to search engines.
|
|
@@ -1,179 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: pre-publish-review
|
|
3
|
-
description: The combined pre-publish gate - one pass for SEO (meta tags, structured data, internal linking, content optimization) and one for editorial quality (grammar, tone, clarity, reading level, terminology, claims policy). Use before shipping any new or rewritten page, or when asked to review, edit, proofread, or QA a page. This is the final review after the required content passes.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
<!-- publisher-seo-kit:content-workflow-route v2 -->
|
|
7
|
-
## Required content passes
|
|
8
|
-
|
|
9
|
-
When this skill writes or revises public-facing prose, follow this package's pipeline order (the skills are siblings in this package): `source-cited-content-builder` →
|
|
10
|
-
`source-cited-humanizer` → `content-defingerprinting` → `internal-linking-optimizer`,
|
|
11
|
-
then the applicable image and `pre-publish-review` steps. Apply linking and review to
|
|
12
|
-
the actual surface, including outreach email and third-party placements. Keep existing
|
|
13
|
-
send/publish approvals. A pass not run is not a pass completed.
|
|
14
|
-
<!-- /publisher-seo-kit:content-workflow-route -->
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
# Pre-Publish Review
|
|
18
|
-
|
|
19
|
-
Two review passes over the page, one report. Pass A is the SEO gate; pass B is the
|
|
20
|
-
editorial gate. Resolve the site's domain, niche, page types, voice, and claims
|
|
21
|
-
policy from `.claude/SITE.md` before starting (start from
|
|
22
|
-
`templates/SITE.template.md` in this package if the project has none). Review the RENDERED page where
|
|
23
|
-
possible, not just the source.
|
|
24
|
-
|
|
25
|
-
## Pass A: SEO review
|
|
26
|
-
|
|
27
|
-
### Meta tags and titles
|
|
28
|
-
|
|
29
|
-
- Title tag: 50-60 characters (and under ~600 rendered pixels), primary keyword included
|
|
30
|
-
- Meta description: 150-160 characters, compelling, ends on a complete sentence
|
|
31
|
-
- Canonical URL set; Open Graph and Twitter Card tags present
|
|
32
|
-
- No duplicate titles or descriptions across pages
|
|
33
|
-
|
|
34
|
-
### Structured data (JSON-LD)
|
|
35
|
-
|
|
36
|
-
- Organization schema site-wide; BreadcrumbList for navigation
|
|
37
|
-
- Page-type schema where it fits: Article for editorial pages, Product/Review ONLY
|
|
38
|
-
where the page genuinely contains a review, FAQPage where a real FAQ renders,
|
|
39
|
-
HowTo for step-by-step guides, LocalBusiness only if the site serves local intent
|
|
40
|
-
- The same content must feed the schema and the visible page (no schema-only FAQs)
|
|
41
|
-
- Validate: no errors in Google's Rich Results Test
|
|
42
|
-
|
|
43
|
-
### Internal linking
|
|
44
|
-
|
|
45
|
-
- 3+ outbound internal links to related pages, descriptive anchors (never "click here")
|
|
46
|
-
- 3+ INBOUND links from established pages: run the orphan check from
|
|
47
|
-
`internal-linking-optimizer`; a page nothing links to is invisible
|
|
48
|
-
- Hub pages link to all their spokes; important pages within 3 clicks of home
|
|
49
|
-
|
|
50
|
-
### Content optimization
|
|
51
|
-
|
|
52
|
-
- Exactly one H1, matching page intent; clean H1 > H2 > H3 hierarchy
|
|
53
|
-
- Primary keyword in the first 100 words; natural density (do not stuff)
|
|
54
|
-
- Alt text on all images; keyword or synonym in alt text and file name where honest
|
|
55
|
-
- External links to authoritative sources
|
|
56
|
-
- No keyword cannibalization: this page's title and inbound anchors must not
|
|
57
|
-
compete with an existing page's primary target
|
|
58
|
-
|
|
59
|
-
### Technical
|
|
60
|
-
|
|
61
|
-
- Clean URL structure; page present in the sitemap; mobile responsive; no broken links
|
|
62
|
-
|
|
63
|
-
### Page types and keyword targets
|
|
64
|
-
|
|
65
|
-
Derive the real patterns from SITE.md. Generic examples for a comparison publisher:
|
|
66
|
-
|
|
67
|
-
| Page type | Key SEO elements | Keyword pattern |
|
|
68
|
-
|-----------|------------------|-----------------|
|
|
69
|
-
| Category hub (`/guides/`) | Head keywords, links to every child | "[category]", "best [category]" |
|
|
70
|
-
| Comparison (`/compare/x-vs-y/`) | "X vs Y" intent, comparison table, FAQ | "[X] vs [Y]", "difference between [X] and [Y]" |
|
|
71
|
-
| Review (`/reviews/<vendor>/`) | Review/Product schema, evidence-first, disclosure | "[brand] review", "is [brand] legit" |
|
|
72
|
-
| Topic explainer (`/what-is-[topic]/`) | Definitional intent, answer-first intro | "what is [topic]", "[topic] explained" |
|
|
73
|
-
| Tool (`/[task]-calculator/`) | Utility intent | "[task] calculator" |
|
|
74
|
-
|
|
75
|
-
## Pass B: Editorial review
|
|
76
|
-
|
|
77
|
-
### Tone and voice
|
|
78
|
-
|
|
79
|
-
Resolve the target voice from SITE.md and hold every page to it. For a comparison
|
|
80
|
-
site the reader is a careful buyer checking your work, so evidence beats enthusiasm.
|
|
81
|
-
Reader-first, direct, trustworthy; claims carry evidence. No hype, no condescension,
|
|
82
|
-
no undefined niche jargon.
|
|
83
|
-
|
|
84
|
-
### Clarity and readability
|
|
85
|
-
|
|
86
|
-
- Reading level: target 8th grade (Flesch-Kincaid)
|
|
87
|
-
- Sentences: 15-20 words average; paragraphs: 2-4 sentences
|
|
88
|
-
- Active voice: "You compare the prices", not "The prices are compared"
|
|
89
|
-
- Define technical terms on first use
|
|
90
|
-
|
|
91
|
-
### Consistency
|
|
92
|
-
|
|
93
|
-
- One term per concept, enforced from the SITE.md terminology table. Sample for a
|
|
94
|
-
health-adjacent comparison site (note the claims-policy rows):
|
|
95
|
-
|
|
96
|
-
| Use | Don't use |
|
|
97
|
-
|-----|-----------|
|
|
98
|
-
| research compound | supplement, medication |
|
|
99
|
-
| third-party tested (with a published CoA) | lab tested (unverified) |
|
|
100
|
-
| certificate of analysis (CoA) | test paper, lab sheet |
|
|
101
|
-
| price per mg | cost (when comparing value) |
|
|
102
|
-
| you | one, the customer |
|
|
103
|
-
|
|
104
|
-
- Spell out one through nine, numerals for 10+; always numerals for money,
|
|
105
|
-
percentages, ages. Dates spelled out (January 15, 2026).
|
|
106
|
-
- Consistent bold/bullets/callouts; descriptive link text
|
|
107
|
-
|
|
108
|
-
### Accuracy and currency
|
|
109
|
-
|
|
110
|
-
- Verify numbers, dates, names against their sources; is the information still current?
|
|
111
|
-
- Links work and go to the right place; sources cited where needed; nothing missing
|
|
112
|
-
|
|
113
|
-
### Claims policy (health-adjacent niches)
|
|
114
|
-
|
|
115
|
-
Any medical, dosage, or "safe/effective for humans" language about research
|
|
116
|
-
compounds is a CRITICAL finding. Affiliate disclosure must be present on pages
|
|
117
|
-
with affiliate links. See SITE.md claims policy.
|
|
118
|
-
|
|
119
|
-
## Red flags to report (either pass)
|
|
120
|
-
|
|
121
|
-
1. Duplicate meta/title across pages, missing H1, or thin content (<300 words on a substantive topic)
|
|
122
|
-
2. Keyword stuffing or unnatural repetition
|
|
123
|
-
3. Missing or wrong schema on key pages; schema asserting content the page lacks
|
|
124
|
-
4. Orphan pages and broken internal links
|
|
125
|
-
5. Missing image alt text
|
|
126
|
-
6. Hype where the reader wants evidence; passive-voice walls; undefined jargon
|
|
127
|
-
7. Inconsistent terminology ("CoA" here, "lab report" there)
|
|
128
|
-
8. Outdated facts (old prices, defunct links); incomplete instructions
|
|
129
|
-
9. Claims-policy violations and missing affiliate disclosure
|
|
130
|
-
|
|
131
|
-
## Output format
|
|
132
|
-
|
|
133
|
-
```markdown
|
|
134
|
-
## Pre-Publish Review: [Page URL]
|
|
135
|
-
|
|
136
|
-
### Verdict: SHIP | FIX FIRST | REWORK (overall grade A-F)
|
|
137
|
-
|
|
138
|
-
### SEO (Pass A)
|
|
139
|
-
- Title: "[current]" - [OK/issue]
|
|
140
|
-
- Description: "[current]" - [OK/issue]
|
|
141
|
-
- Canonical/OG: [OK/missing]
|
|
142
|
-
- Schema: [types present] - [missing/errors]
|
|
143
|
-
- H1 + hierarchy: [OK/issue]
|
|
144
|
-
- Internal links: [X] out / [X] in - orphan: [yes/no]
|
|
145
|
-
- Keyword: "[primary]" placement [OK/issue]; cannibalization risk: [none/page]
|
|
146
|
-
|
|
147
|
-
### Editorial (Pass B)
|
|
148
|
-
- Voice fit (SITE.md): [good/needs work]
|
|
149
|
-
- Grade level: [X]; avg sentence: [X] words; passive: [X]%
|
|
150
|
-
- Terminology: [consistent/list conflicts]
|
|
151
|
-
- Claims policy: [clean/VIOLATIONS listed first]
|
|
152
|
-
|
|
153
|
-
### Issues (ranked, most severe first)
|
|
154
|
-
1. [Location]: "[original]" -> issue -> "[suggested fix]"
|
|
155
|
-
|
|
156
|
-
### Quick wins
|
|
157
|
-
1. [Easy improvement]
|
|
158
|
-
```
|
|
159
|
-
|
|
160
|
-
## Sample rewrites (the editorial bar)
|
|
161
|
-
|
|
162
|
-
Too vague:
|
|
163
|
-
> This vendor is arguably one of the better options currently available on the market.
|
|
164
|
-
|
|
165
|
-
Evidence-first:
|
|
166
|
-
> This vendor publishes a third-party CoA for every batch and shipped our test order in two days. Most competitors do neither.
|
|
167
|
-
|
|
168
|
-
Too complex:
|
|
169
|
-
> The product is subjected to independent HPLC verification protocols to substantiate purity assertions.
|
|
170
|
-
|
|
171
|
-
Simple and direct:
|
|
172
|
-
> An independent lab tests each batch for purity using HPLC. The vendor publishes the results, so you can check them yourself.
|
|
173
|
-
|
|
174
|
-
## Relationship to sibling skills
|
|
175
|
-
|
|
176
|
-
- `onpage-seo-audit` REFACTORS a page (keyword/entity/schema work); this skill GATES
|
|
177
|
-
it. Run the audit to fix, this review to ship.
|
|
178
|
-
- The banned-phrase scan is `source-cited-humanizer`, using `source-cited-content-builder` rules;
|
|
179
|
-
run it before this review, not instead of it.
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: source-cited-content-builder
|
|
3
|
-
description: Write or refactor source-cited web content with a concise human tone, strict citation fields, grammar constraints, no em dashes, and a large banned phrase list. Use for content building, content humanizing, blog/page copy, guides, comparison and review pages, and SEO content drafts that must follow the site's exact source and style rules.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
<!-- publisher-seo-kit:content-workflow-route v2 -->
|
|
7
|
-
## Required content passes
|
|
8
|
-
|
|
9
|
-
When this skill writes or revises public-facing prose, follow this package's pipeline order (the skills are siblings in this package): `source-cited-content-builder` →
|
|
10
|
-
`source-cited-humanizer` → `content-defingerprinting` → `internal-linking-optimizer`,
|
|
11
|
-
then the applicable image and `pre-publish-review` steps. Apply linking and review to
|
|
12
|
-
the actual surface, including outreach email and third-party placements. Keep existing
|
|
13
|
-
send/publish approvals. A pass not run is not a pass completed.
|
|
14
|
-
<!-- /publisher-seo-kit:content-workflow-route -->
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
# Source-Cited Content Builder
|
|
18
|
-
|
|
19
|
-
Use this skill when writing or revising content that must follow the user's citation, grammar, and banned-phrase rules.
|
|
20
|
-
|
|
21
|
-
## Workflow
|
|
22
|
-
|
|
23
|
-
1. Read `references/source-prompt.md` before writing or editing content.
|
|
24
|
-
2. Gather facts from reputable, citable sources. Favor government, standards bodies, utilities, manufacturers, and recognized industry publications. Add your niche's preferred primary sources on top (SITE.md). For a comparison site in a regulated niche that means peer-reviewed literature, supplier certificates of analysis, and the relevant regulator's pages, and never marketing claims from vendors.
|
|
25
|
-
3. Record each unique source with Title, Publisher, Publication Date, and URL.
|
|
26
|
-
4. Draft concise, conversational copy using active voice.
|
|
27
|
-
5. Check the copy against the banned word and phrase list in the source prompt.
|
|
28
|
-
6. Remove em dashes from the final content.
|
|
29
|
-
7. Before treating the page as ready, run your site's pre-publish SEO checklist (info-gain, answer-first, entity/keyword discipline, internal links, meta length).
|
|
30
|
-
|
|
31
|
-
## Humanize pass on existing copy
|
|
32
|
-
|
|
33
|
-
This skill is also the standalone humanizer: run it on ANY content after it is
|
|
34
|
-
written, whoever or whatever wrote it (this is stage 2 of the content pipeline).
|
|
35
|
-
|
|
36
|
-
1. Read `references/source-prompt.md`.
|
|
37
|
-
2. Scan the file(s) against the full banned word and phrase list, the grammar rules
|
|
38
|
-
(active voice, concise conversational sentences), and the em-dash ban.
|
|
39
|
-
3. Fix each violation in place; keep meaning, citations, and structure intact.
|
|
40
|
-
4. Report what changed: each banned term found and its replacement.
|
|
41
|
-
|
|
42
|
-
Nothing else in a typical build chain checks tone. A page can pass every structural
|
|
43
|
-
gate and still read as AI slop; this pass is the only thing standing in the way.
|
|
44
|
-
|
|
45
|
-
## Guardrails
|
|
46
|
-
|
|
47
|
-
- Do not invent facts or cite weak sources when official sources exist.
|
|
48
|
-
- Keep source records near the content or in the repo's existing citation field format.
|
|
49
|
-
- In a YMYL or YMYL-adjacent niche (legal, financial, health-adjacent, research compounds), pair this skill with your site's compliance review (SITE.md claims policy) before public-facing publication.
|
|
50
|
-
|
|
51
|
-
## The prompt reference
|
|
52
|
-
|
|
53
|
-
`references/source-prompt.md` is generic and applies to any site: the citation
|
|
54
|
-
fields, the grammar rules, and the ~600-term banned-phrase list are in force
|
|
55
|
-
verbatim. The one thing the operator adds is niche-specific source preferences
|
|
56
|
-
(step 2 above), recorded in SITE.md, not by editing the reference.
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
content building
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
The following are strict requirements for the content above:
|
|
5
|
-
|
|
6
|
-
Source citing rules:
|
|
7
|
-
- Pull facts only from reputable, citable sources.
|
|
8
|
-
- Favor government sites, standards bodies, utilities, manufacturers, and recognized industry publications.
|
|
9
|
-
- Record each unique source as: Title, Publisher, Publication Date, URL.
|
|
10
|
-
|
|
11
|
-
Grammatical rules:
|
|
12
|
-
- No em dashes.
|
|
13
|
-
- Active voice.
|
|
14
|
-
- Concise, conversational sentences.
|
|
15
|
-
- Use short transitional prompts to keep readers moving, such as “Here is why,” “Let’s break it down,” and “Next steps.”
|
|
16
|
-
- No contrast-frame constructions: never write "it's not X, it's Y" or "this isn't just X, it's Y". State what the thing is directly.
|
|
17
|
-
|
|
18
|
-
Banned words and phrases
|
|
19
|
-
Avoid every word or phrase in this list: Accordingly, Additionally, Arguably, Certainly, Consequently, Hence, However, Indeed, Moreover, Nevertheless, Nonetheless, Notwithstanding, Thus, Undoubtedly, Adept, Commendable, Dynamic, Efficient, Ever-evolving, Exciting, Exemplary, Innovative, Invaluable, Robust, Seamless, Synergistic, Thought-provoking, Transformative, Utmost, Vibrant, Vital, Efficiency, Innovation, Institution, Integration, Implementation, Landscape, Optimization, Realm, Tapestry, Transformation, Aligns, Augment, Delve, Embark, Facilitate, Maximize, Underscores, Utilize, A testament to, In conclusion, In summary, It's important to note/consider, It's worth noting that, On the contrary, This is not an exhaustive list, A journey of, A multitude of, A plethora of, Actionable insights, Adoption rate, Aforementioned, Agile, AI-powered, Ample opportunities, Amplify, Arduous, As a result, As such, At length, At the end of the day, Bandwidth, Based on the information provided, Basic, Best practices, Blockchain-enabled, Brand awareness, Broadly speaking, Burgeoning, Cannot be overstated, Capacity building, Captivating, Change management, Cloud-based, Cognizant, Collaborative environment, Competitive landscape, Complexity, Conceptualize, Conducting, Considerable, Continuous improvement, Core, Corporate social responsibility, Cost optimization, Craft, Critical, Crucial, Customer loyalty, Customer satisfaction, Customer-centric, Cutting-edge, Data-driven, Decision-makers, Deep dive, Deep dive into, Deep understanding, Deliverables, Delve into, Delved, Delving, Delving into the intricacies of, Demonstrates significant, Deployment plan, Digital realm, Digital transformation, Disruptive innovation, Domain expertise, Downtime, Drive, Driven approach, Driving innovation, Dynamic environment, Elevate, Embark on a journey, Embark on a voyage, Embarked, Emerging technologies, Empower, Enable, Encountered hurdles, Enhance, Enhancing, Enlightening, Enriches, Entails, Entrenched, Epicenter, Essential, Essentially, Esteemed, Ethical considerations, Excels, Expertise, Explore, Flourishing, Folks, For example, For instance, Foray, Foster, Foster innovation, Fostering, Fresh perspectives, From inception to execution, Fundamental, Fundamentally, Furthermore, Future-proof, Game changer, Game-changer, Generally speaking, Given that, Glean, Going forward, Golden ticket, Governance framework, Granular, Granular detail, Granular level, Granularly, Grasp, Groundbreaking, Growing recognition, Herein, Heretofore, High-level, Hinder, Holistic, Holistically, Impactful, Implementation strategy, Implications, Important to consider, In a sea of, In brief, In detail, In effect, In essence, In general, In light of, In other words, In particular, In practice, In terms of, In the dynamic world of, In the realm of, In theory, In today's rapidly evolving market, In today's world, Industry best practices, Influencers, Insights into, Issue resolution, It is important to note, It is worth noting, It's important to remember, Iteration, Kaleidoscope, Key, Key takeaways, Knowledge transfer, KPIs, Latency, Leverage, Linchpin, Low-level, Manifold, Market penetration, Market share, Market trends, Milestone, Mission-critical, Moving forward, Multifaceted, MVP, Namely, Navigating the landscape, Navigating the complexities of, New heights, Next-generation, Notable, Nuanced, Numerous, Offboarding, Offer a comprehensive, Offerings, On the ascent to, On the cutting edge, On the other hand, Onboarding, Operational efficiency, Operational excellence, Optimize, Pain point, Paradigm, Paradigm shift, Paramount, Particularly in areas, Performance optimization, Pervasive, Pivotal, Plethora, POC, Preemptively, Primary, Problem solving, Process optimization, Profitability, Profound, Promote, Pronged, Quality assurance, Quality control, Rapidly evolving, Reaching new heights, Recognize, Regulatory compliance, Relentless, Remarkable, Resonate, Resource allocation, Resource optimization, Revenue growth, Risk mitigation, Roadmap, ROI, Root cause analysis, Scalable, Scrum, Secondary, Shed light, Shedding light on, Showcasing, Significant, Significantly contributes, Simply put, SLA, Solution development, Specifically, Specifically speaking, Sprint, Stakeholders, State-of-the-art, Strategic alignment, Streamline, Strive, Strong presence, Subject matter experts, Substantial, Substantially, Sustainability, Synergistically, Synergy, Systemic, Tailor, TCO, Tertiary, That being said, The future of, The linchpin of, The next frontier, The power of, The road ahead, Thereby, Therefore, Therein, Thereof, Thought leaders, Thought leadership, Thrive, Thriving, Throughput, Time optimization, To clarify, To demonstrate, To elevate, To elucidate, To emphasize, To empower, To enhance, To enrich, To exemplify, To furnish, To highlight, To illustrate, To provide, To reiterate, To shed light on, To showcase, To summarize, To thrive, To underscore, To unleash, To unlock, Touchpoint, Transforming the way, Treasure trove, Ultimately, Uncharted waters, Undeniable, Understanding of your unique, Unleash, Unlock, Unparalleled, Uptime, User engagement, User experience, User feedback, User interface, Valuable, Value proposition, Value-added, Various, Vast, Well-crafted, Whilst, Whilst it is true, Widely recognized, With a keen eye on, With regards to
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: source-cited-humanizer
|
|
3
|
-
description: Run the required editorial humanizing pass after drafting or revising public content. Apply the source-cited-content-builder's canonical voice and banned-phrase rules while preserving facts, meaning and citations.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Source-cited humanizer
|
|
7
|
-
|
|
8
|
-
Run as a separate pass after writing, including outreach copy, contributed articles,
|
|
9
|
-
placement content and adapted social posts. Read the sibling
|
|
10
|
-
`source-cited-content-builder/SKILL.md` and its `references/source-prompt.md`; they
|
|
11
|
-
own the voice rules and banned list. Use the site's more specific voice references
|
|
12
|
-
when present. Do not maintain a second copy of the banned list.
|
|
13
|
-
|
|
14
|
-
Review titles, headings, descriptions and body copy. Remove formulaic framing,
|
|
15
|
-
repetition, unsupported certainty, banned phrases and em dashes. Keep useful specifics,
|
|
16
|
-
source records and the author's actual meaning. Never invent anecdotes or measurements.
|
|
17
|
-
Use the builder's humanize-pass procedure and report the material edits.
|
|
18
|
-
|
|
19
|
-
Next run `content-defingerprinting`, then `internal-linking-optimizer` for the actual
|
|
20
|
-
publishing surface. A clean technical build does not replace this editorial pass.
|