agentlinkops 0.5.0

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 (115) hide show
  1. package/.claude-plugin/plugin.json +10 -0
  2. package/.codex-plugin/plugin.json +24 -0
  3. package/CHANGELOG.md +52 -0
  4. package/LICENSE +190 -0
  5. package/NOTICE +17 -0
  6. package/README.md +202 -0
  7. package/bin/agentlinkops.mjs +4 -0
  8. package/bin/linktrail.mjs +6 -0
  9. package/cli/adapters/csv.js +68 -0
  10. package/cli/adapters/sqlite-crm.js +79 -0
  11. package/cli/adapters/suppliers.js +180 -0
  12. package/cli/agent-setup.js +203 -0
  13. package/cli/agentlinkops.mjs +4 -0
  14. package/cli/args.js +18 -0
  15. package/cli/catalog.js +7483 -0
  16. package/cli/check.js +119 -0
  17. package/cli/citation.js +109 -0
  18. package/cli/client.js +60 -0
  19. package/cli/commands.js +183 -0
  20. package/cli/config.js +104 -0
  21. package/cli/connection.js +90 -0
  22. package/cli/context-mcp.js +193 -0
  23. package/cli/context.js +340 -0
  24. package/cli/delivery.js +67 -0
  25. package/cli/doctor.js +283 -0
  26. package/cli/env.js +66 -0
  27. package/cli/fleet.js +82 -0
  28. package/cli/gsc-browser.js +239 -0
  29. package/cli/import.js +108 -0
  30. package/cli/ledger.js +232 -0
  31. package/cli/linktrail.mjs +6 -0
  32. package/cli/local-result.js +161 -0
  33. package/cli/main.js +523 -0
  34. package/cli/mirror.js +126 -0
  35. package/cli/mix.js +123 -0
  36. package/cli/platforms.js +161 -0
  37. package/cli/receipt-performance.js +64 -0
  38. package/cli/receipts.js +122 -0
  39. package/cli/report.js +158 -0
  40. package/cli/setup-plan.js +211 -0
  41. package/cli/skill.js +39 -0
  42. package/cli/state.js +106 -0
  43. package/cli/status.js +51 -0
  44. package/cli/sync.js +179 -0
  45. package/package.json +59 -0
  46. package/references/cli.md +198 -0
  47. package/references/disavow.md +73 -0
  48. package/references/reports.md +53 -0
  49. package/scripts/agentlinkops.py +651 -0
  50. package/scripts/disavow.py +207 -0
  51. package/scripts/linktrail.py +10 -0
  52. package/scripts/migrations/001_crm.sql +45 -0
  53. package/scripts/migrations/002_cloud_events.sql +13 -0
  54. package/scripts/migrations/003_disavow.sql +20 -0
  55. package/scripts/migrations/004_placement_costs.sql +2 -0
  56. package/scripts/report.py +113 -0
  57. package/shared/agent-clients.js +49 -0
  58. package/shared/observation-event.js +43 -0
  59. package/shared/response-contract.js +59 -0
  60. package/shared/search-connection-contract.js +18 -0
  61. package/skills/agentlinkops-assets/SKILL.md +13 -0
  62. package/skills/agentlinkops-assets/agents/openai.yaml +5 -0
  63. package/skills/agentlinkops-campaigns/SKILL.md +17 -0
  64. package/skills/agentlinkops-campaigns/agents/openai.yaml +12 -0
  65. package/skills/agentlinkops-connect/SKILL.md +33 -0
  66. package/skills/agentlinkops-connect/agents/openai.yaml +12 -0
  67. package/skills/agentlinkops-connect/references/agentlinkops.md +266 -0
  68. package/skills/agentlinkops-crm/SKILL.md +27 -0
  69. package/skills/agentlinkops-crm/agents/openai.yaml +12 -0
  70. package/skills/content-defingerprinting/SKILL.md +29 -0
  71. package/skills/content-defingerprinting/scripts/watermarks/README.md +102 -0
  72. package/skills/content-defingerprinting/scripts/watermarks/UPSTREAM.json +26 -0
  73. package/skills/content-defingerprinting/scripts/watermarks/revendor.sh +52 -0
  74. package/skills/content-defingerprinting/scripts/watermarks/vendor/LICENSE.upstream +21 -0
  75. package/skills/content-defingerprinting/scripts/watermarks/vendor/clean_text.py +96 -0
  76. package/skills/content-defingerprinting/scripts/watermarks/vendor/common.py +432 -0
  77. package/skills/content-defingerprinting/scripts/watermarks/vendor/inspect_text.py +86 -0
  78. package/skills/content-defingerprinting/scripts/watermarks/vendor/score_stylometry.py +460 -0
  79. package/skills/content-defingerprinting/scripts/watermarks/vendor/text_unicode.py +651 -0
  80. package/skills/content-defingerprinting/scripts/watermarks/verify-vendor.py +27 -0
  81. package/skills/content-defingerprinting/scripts/watermarks/wm-scan.py +212 -0
  82. package/skills/internal-linking-optimizer/SKILL.md +56 -0
  83. package/skills/internal-linking-optimizer/references/source-prompt.md +76 -0
  84. package/skills/pre-publish-review/SKILL.md +179 -0
  85. package/skills/source-cited-content-builder/SKILL.md +56 -0
  86. package/skills/source-cited-content-builder/references/source-prompt.md +19 -0
  87. package/skills/source-cited-humanizer/SKILL.md +20 -0
  88. package/src/citations/adapter.js +141 -0
  89. package/src/citations/contract.js +171 -0
  90. package/src/citations/match.js +120 -0
  91. package/src/citations/runner.js +151 -0
  92. package/src/citations/stats.js +74 -0
  93. package/src/competitors/contract.js +157 -0
  94. package/src/competitors/domain-mix.js +199 -0
  95. package/src/context/ga4.js +652 -0
  96. package/src/context/gsc.js +925 -0
  97. package/src/context/site-profile.js +445 -0
  98. package/src/context/util.js +71 -0
  99. package/src/context-tool-registry.js +27 -0
  100. package/src/corpus/acquire.js +135 -0
  101. package/src/corpus/seeds.js +182 -0
  102. package/src/discovery/contract.js +237 -0
  103. package/src/discovery/import.js +156 -0
  104. package/src/tool-views.js +117 -0
  105. package/src/verifier/fetch.js +303 -0
  106. package/src/verifier/index.js +311 -0
  107. package/src/verifier/observation-kind.js +91 -0
  108. package/src/verifier/parser.js +241 -0
  109. package/src/verifier/readiness.js +90 -0
  110. package/src/verifier/render-evidence.js +57 -0
  111. package/src/verifier/robots.js +85 -0
  112. package/src/verifier/transition.js +129 -0
  113. package/src/verifier/url.js +56 -0
  114. package/templates/SITE.template.md +59 -0
  115. package/templates/campaigns.v1.json +65 -0
@@ -0,0 +1,212 @@
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(/&nbsp;| |<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())
@@ -0,0 +1,56 @@
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.
@@ -0,0 +1,76 @@
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.
@@ -0,0 +1,179 @@
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.
@@ -0,0 +1,56 @@
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.
@@ -0,0 +1,19 @@
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
@@ -0,0 +1,20 @@
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.