agentlinkops 0.6.13 → 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.
Files changed (178) hide show
  1. package/.claude-plugin/plugin.json +2 -2
  2. package/.codex-plugin/plugin.json +2 -2
  3. package/CHANGELOG.md +25 -2
  4. package/PACK-ARTIFACT.json +16 -0
  5. package/PACKS.json +591 -0
  6. package/README.md +34 -48
  7. package/cli/adapters/suppliers.js +1 -1
  8. package/cli/agent-setup.js +101 -17
  9. package/cli/campaign-bridge.js +325 -0
  10. package/cli/campaign-outcomes.js +107 -0
  11. package/cli/catalog.js +45702 -18674
  12. package/cli/check.js +40 -10
  13. package/cli/client.js +2 -1
  14. package/cli/commands.js +17 -8
  15. package/cli/connection.js +92 -18
  16. package/cli/contact-adoption.js +91 -0
  17. package/cli/context.js +13 -2
  18. package/cli/doctor.js +15 -4
  19. package/cli/import.js +7 -1
  20. package/cli/key-store.js +115 -0
  21. package/cli/ledger.js +1 -0
  22. package/cli/local-result.js +41 -6
  23. package/cli/main.js +51 -12
  24. package/cli/mcp-client.js +2 -2
  25. package/cli/migration.js +308 -0
  26. package/cli/prompt.js +25 -0
  27. package/cli/public-http.js +168 -0
  28. package/cli/state.js +14 -0
  29. package/cli/sync.js +1 -1
  30. package/package.json +7 -8
  31. package/references/citation-panels.md +2 -0
  32. package/references/cli.md +2 -2
  33. package/references/disavow.md +1 -1
  34. package/references/discovery-handoff.md +1 -1
  35. package/references/local-crm-draft-handoff.md +1 -1
  36. package/references/portable-ledger-handoff.md +11 -10
  37. package/references/recipes/catalog.json +263 -7
  38. package/references/recipes/command-notes.md +5 -3
  39. package/references/recipes/internal-link-improvement.md +25 -0
  40. package/references/recipes/placement-reconciliation.md +53 -1
  41. package/scripts/portable-handoff.py +17 -4
  42. package/shared/admission-contract.js +3 -2
  43. package/shared/admission-report-contract.js +3 -2
  44. package/shared/analytics-history-contract.js +15 -0
  45. package/shared/campaign-outcome-contract.js +12 -0
  46. package/shared/campaign-prospect-contract.js +23 -0
  47. package/shared/classification-contract.js +54 -0
  48. package/shared/contact-record-contract.js +27 -0
  49. package/shared/disavow-contract.js +37 -9
  50. package/shared/index-observation-contract.js +5 -4
  51. package/shared/internal-links-contract.js +143 -0
  52. package/shared/link-category-contract.js +35 -0
  53. package/shared/link-category.js +138 -0
  54. package/shared/link-labels.js +26 -0
  55. package/shared/link-summary-contract.js +17 -0
  56. package/shared/observation-event.js +1 -1
  57. package/shared/onboarding.js +20 -0
  58. package/shared/response-contract.js +38 -5
  59. package/shared/search-connection-contract.js +2 -1
  60. package/shared/table-page-contract.js +13 -0
  61. package/skills/agentlinkops-assets/SKILL-DEPS.json +290 -0
  62. package/skills/agentlinkops-assets/SKILL.md +3 -1
  63. package/skills/agentlinkops-assets/agents/openai.yaml +1 -1
  64. package/skills/agentlinkops-assets/references/portable/references/cli.md +220 -0
  65. package/skills/agentlinkops-assets/references/portable/references/disavow.md +73 -0
  66. package/skills/agentlinkops-assets/references/portable/references/reports.md +53 -0
  67. package/skills/agentlinkops-assets/references/portable/scripts/agentlinkops.py +676 -0
  68. package/skills/agentlinkops-assets/references/portable/scripts/disavow.py +207 -0
  69. package/skills/agentlinkops-assets/references/portable/scripts/migrations/001_crm.sql +45 -0
  70. package/skills/agentlinkops-assets/references/portable/scripts/migrations/002_cloud_events.sql +13 -0
  71. package/skills/agentlinkops-assets/references/portable/scripts/migrations/003_disavow.sql +20 -0
  72. package/skills/agentlinkops-assets/references/portable/scripts/migrations/004_placement_costs.sql +2 -0
  73. package/skills/agentlinkops-assets/references/portable/scripts/report.py +113 -0
  74. package/skills/agentlinkops-assets/references/portable/templates/campaigns.v1.json +65 -0
  75. package/skills/agentlinkops-campaigns/SKILL-DEPS.json +336 -0
  76. package/skills/agentlinkops-campaigns/SKILL.md +7 -5
  77. package/skills/agentlinkops-campaigns/agents/openai.yaml +1 -1
  78. package/skills/agentlinkops-campaigns/references/first-campaign.md +31 -0
  79. package/skills/agentlinkops-campaigns/references/mailbox-campaign.md +46 -0
  80. package/skills/agentlinkops-campaigns/references/portable/references/cli.md +220 -0
  81. package/skills/agentlinkops-campaigns/references/portable/references/disavow.md +73 -0
  82. package/skills/agentlinkops-campaigns/references/portable/references/reports.md +53 -0
  83. package/skills/agentlinkops-campaigns/references/portable/scripts/agentlinkops.py +676 -0
  84. package/skills/agentlinkops-campaigns/references/portable/scripts/disavow.py +207 -0
  85. package/skills/agentlinkops-campaigns/references/portable/scripts/migrations/001_crm.sql +45 -0
  86. package/skills/agentlinkops-campaigns/references/portable/scripts/migrations/002_cloud_events.sql +13 -0
  87. package/skills/agentlinkops-campaigns/references/portable/scripts/migrations/003_disavow.sql +20 -0
  88. package/skills/agentlinkops-campaigns/references/portable/scripts/migrations/004_placement_costs.sql +2 -0
  89. package/skills/agentlinkops-campaigns/references/portable/scripts/report.py +113 -0
  90. package/skills/agentlinkops-campaigns/references/portable/templates/campaigns.v1.json +65 -0
  91. package/skills/agentlinkops-connect/SKILL-DEPS.json +104 -0
  92. package/skills/agentlinkops-connect/SKILL.md +2 -0
  93. package/skills/agentlinkops-connect/agents/openai.yaml +1 -1
  94. package/skills/agentlinkops-connect/references/agentlinkops.md +164 -62
  95. package/skills/agentlinkops-connect/references/placement-workflows.md +19 -0
  96. package/skills/agentlinkops-crm/SKILL-DEPS.json +381 -0
  97. package/skills/agentlinkops-crm/SKILL.md +26 -9
  98. package/skills/agentlinkops-crm/agents/openai.yaml +1 -1
  99. package/skills/agentlinkops-crm/references/portable/references/cli.md +220 -0
  100. package/skills/agentlinkops-crm/references/portable/references/disavow.md +73 -0
  101. package/skills/agentlinkops-crm/references/portable/references/local-crm-draft-handoff.md +76 -0
  102. package/skills/agentlinkops-crm/references/portable/references/portable-ledger-handoff.md +51 -0
  103. package/skills/agentlinkops-crm/references/portable/references/reports.md +53 -0
  104. package/skills/agentlinkops-crm/references/portable/scripts/agentlinkops.py +676 -0
  105. package/skills/agentlinkops-crm/references/portable/scripts/disavow.py +207 -0
  106. package/skills/agentlinkops-crm/references/portable/scripts/migrations/001_crm.sql +45 -0
  107. package/skills/agentlinkops-crm/references/portable/scripts/migrations/002_cloud_events.sql +13 -0
  108. package/skills/agentlinkops-crm/references/portable/scripts/migrations/003_disavow.sql +20 -0
  109. package/skills/agentlinkops-crm/references/portable/scripts/migrations/004_placement_costs.sql +2 -0
  110. package/skills/agentlinkops-crm/references/portable/scripts/outreach-crm-draft.py +121 -0
  111. package/skills/agentlinkops-crm/references/portable/scripts/portable-handoff.py +197 -0
  112. package/skills/agentlinkops-crm/references/portable/scripts/report.py +113 -0
  113. package/skills/agentlinkops-crm/references/portable/templates/campaigns.v1.json +65 -0
  114. package/skills/agentlinkops-discovery/SKILL-DEPS.json +301 -0
  115. package/skills/agentlinkops-discovery/SKILL.md +4 -2
  116. package/skills/agentlinkops-discovery/references/portable/references/cli.md +220 -0
  117. package/skills/agentlinkops-discovery/references/portable/references/disavow.md +73 -0
  118. package/skills/agentlinkops-discovery/references/portable/references/discovery-handoff.md +32 -0
  119. package/skills/agentlinkops-discovery/references/portable/references/reports.md +53 -0
  120. package/skills/agentlinkops-discovery/references/portable/scripts/agentlinkops.py +676 -0
  121. package/skills/agentlinkops-discovery/references/portable/scripts/disavow.py +207 -0
  122. package/skills/agentlinkops-discovery/references/portable/scripts/migrations/001_crm.sql +45 -0
  123. package/skills/agentlinkops-discovery/references/portable/scripts/migrations/002_cloud_events.sql +13 -0
  124. package/skills/agentlinkops-discovery/references/portable/scripts/migrations/003_disavow.sql +20 -0
  125. package/skills/agentlinkops-discovery/references/portable/scripts/migrations/004_placement_costs.sql +2 -0
  126. package/skills/agentlinkops-discovery/references/portable/scripts/report.py +113 -0
  127. package/skills/agentlinkops-discovery/references/portable/templates/campaigns.v1.json +65 -0
  128. package/skills/agentlinkops-discovery/references/saved-backlink-workflows.md +23 -0
  129. package/src/competitors/contract.js +17 -1
  130. package/src/context/site-profile.js +34 -121
  131. package/src/corpus/acquire.js +68 -32
  132. package/src/corpus/extract.js +147 -0
  133. package/src/corpus/frontier.js +151 -0
  134. package/src/discovery/contract.js +8 -0
  135. package/src/discovery/import.js +13 -1
  136. package/src/mentions.js +193 -0
  137. package/src/page-acquisition/acquire.js +50 -0
  138. package/src/page-acquisition/bytes.js +138 -0
  139. package/src/page-acquisition/capture.js +11 -0
  140. package/src/page-acquisition/contracts.js +67 -0
  141. package/src/page-acquisition/documents.js +166 -0
  142. package/src/page-acquisition/http.js +307 -0
  143. package/src/page-acquisition/policy.js +20 -0
  144. package/src/page-acquisition/recovery.js +164 -0
  145. package/src/page-acquisition/render-failure.js +82 -0
  146. package/src/page-extraction/html.js +359 -0
  147. package/src/page-extraction/index.js +30 -0
  148. package/src/page-extraction/metadata.js +16 -0
  149. package/src/response-shaping.js +4 -3
  150. package/src/tool-views.js +22 -12
  151. package/src/verifier/fetch.js +4 -339
  152. package/src/verifier/index.js +81 -23
  153. package/src/verifier/page-quality.js +14 -0
  154. package/src/verifier/parser.js +2 -241
  155. package/src/verifier/readiness.js +64 -13
  156. package/src/verifier/render-evidence.js +25 -2
  157. package/src/verifier/target.js +201 -0
  158. package/src/verifier/transition.js +18 -3
  159. package/src/verifier/url.js +31 -0
  160. package/src/watch-crawlability.js +144 -0
  161. package/skills/content-defingerprinting/SKILL.md +0 -29
  162. package/skills/content-defingerprinting/scripts/watermarks/README.md +0 -102
  163. package/skills/content-defingerprinting/scripts/watermarks/UPSTREAM.json +0 -26
  164. package/skills/content-defingerprinting/scripts/watermarks/revendor.sh +0 -52
  165. package/skills/content-defingerprinting/scripts/watermarks/vendor/LICENSE.upstream +0 -21
  166. package/skills/content-defingerprinting/scripts/watermarks/vendor/clean_text.py +0 -96
  167. package/skills/content-defingerprinting/scripts/watermarks/vendor/common.py +0 -432
  168. package/skills/content-defingerprinting/scripts/watermarks/vendor/inspect_text.py +0 -86
  169. package/skills/content-defingerprinting/scripts/watermarks/vendor/score_stylometry.py +0 -460
  170. package/skills/content-defingerprinting/scripts/watermarks/vendor/text_unicode.py +0 -651
  171. package/skills/content-defingerprinting/scripts/watermarks/verify-vendor.py +0 -27
  172. package/skills/content-defingerprinting/scripts/watermarks/wm-scan.py +0 -212
  173. package/skills/internal-linking-optimizer/SKILL.md +0 -56
  174. package/skills/internal-linking-optimizer/references/source-prompt.md +0 -76
  175. package/skills/pre-publish-review/SKILL.md +0 -179
  176. package/skills/source-cited-content-builder/SKILL.md +0 -56
  177. package/skills/source-cited-content-builder/references/source-prompt.md +0 -19
  178. package/skills/source-cited-humanizer/SKILL.md +0 -20
@@ -0,0 +1,381 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "skill": "agentlinkops-crm",
4
+ "pack": "product",
5
+ "contractSha256": "e3d29a169dd1ecae2db26b22ab666419c4057e84831653df655f04ae61725e93",
6
+ "sourceManifest": [
7
+ {
8
+ "path": "references/cli.md",
9
+ "sha256": "7b665f9d9b60cdab1f0238b71500f8389e0a6df4ea9777db69af6627a000a766"
10
+ },
11
+ {
12
+ "path": "references/disavow.md",
13
+ "sha256": "f8a2ad2c779e15547c6cf6a199b1d4af18ad2ef2c0aa8f27094c00f366c55aaa"
14
+ },
15
+ {
16
+ "path": "references/local-crm-draft-handoff.md",
17
+ "sha256": "4fb6f0bc9caf5e4ba79250ea41d4588f9d504b04c63d7e388d8e471b850924b7"
18
+ },
19
+ {
20
+ "path": "references/portable-ledger-handoff.md",
21
+ "sha256": "fa4c3c7efea90dd8007e5ba25e4dbb67bfafa8963d91000eb3d58da61b1d9db6"
22
+ },
23
+ {
24
+ "path": "references/reports.md",
25
+ "sha256": "361ea12f145daf15c30d35cfaec3f41bfa677fee9c5eabf7dc10b6004cbe617e"
26
+ },
27
+ {
28
+ "path": "scripts/agentlinkops.py",
29
+ "sha256": "91d541768f95e17c059396624c153ca86395bccfc565a8bf3470e2e006404e28"
30
+ },
31
+ {
32
+ "path": "scripts/disavow.py",
33
+ "sha256": "cae36ad7d9e4aef27510975b4c15a66e5649250f6e76df7ca2bfb025a696432e"
34
+ },
35
+ {
36
+ "path": "scripts/migrations/001_crm.sql",
37
+ "sha256": "049fbd38b05c5b8dbab00b6ebee5342b8ed5cf48f65fe6cc1bbf41330ceedf54"
38
+ },
39
+ {
40
+ "path": "scripts/migrations/002_cloud_events.sql",
41
+ "sha256": "9040c607408ffd9a168bb3c30431846ddbc7a3429b2a30ba3ecafd4048ccc0c3"
42
+ },
43
+ {
44
+ "path": "scripts/migrations/003_disavow.sql",
45
+ "sha256": "ff47da734afaff5ab364dc0ae53c3db58254d0a30ca5250de8172a67f8ec2772"
46
+ },
47
+ {
48
+ "path": "scripts/migrations/004_placement_costs.sql",
49
+ "sha256": "e25732a3abd95d54320984068d9a4242ee2d0b89f6c70330a24f63bd0a3671a2"
50
+ },
51
+ {
52
+ "path": "scripts/outreach-crm-draft.py",
53
+ "sha256": "f673603b4be3f20df44a9531191241ae2c2e44881b9d82f8fa42fba7c327da7a"
54
+ },
55
+ {
56
+ "path": "scripts/portable-handoff.py",
57
+ "sha256": "c4aa4036b41f840bf4eebfbff1e8a6b441f2706d09e027d7eb4f746f4f7eee0d"
58
+ },
59
+ {
60
+ "path": "scripts/report.py",
61
+ "sha256": "c7088c3314d0453d62e8a70f0c80f535b219b2ea127ca7d1c0731b216a9cb602"
62
+ },
63
+ {
64
+ "path": "skills/agentlinkops-crm/SKILL.md",
65
+ "sha256": "c1131f7abfb76229a9346e7c9ff9cf71e580a540e11bc2caeba969d31235802a"
66
+ },
67
+ {
68
+ "path": "skills/agentlinkops-crm/agents/openai.yaml",
69
+ "sha256": "692201114c28fa70250fae09230d15fb182b1e1b3ce84f737bec1773b3fd68b1"
70
+ },
71
+ {
72
+ "path": "templates/campaigns.v1.json",
73
+ "sha256": "768e1610d64b82a4e5872c301eb2a537705821b2f01e9f2265c8056f7da4a496"
74
+ }
75
+ ],
76
+ "members": [
77
+ {
78
+ "path": "SKILL.md",
79
+ "sha256": "1ac0d2c4a1a1c0b0f1f18302577656d6f3e8e22c7329ecba92b3951e78715867"
80
+ },
81
+ {
82
+ "path": "agents/openai.yaml",
83
+ "sha256": "692201114c28fa70250fae09230d15fb182b1e1b3ce84f737bec1773b3fd68b1"
84
+ },
85
+ {
86
+ "path": "references/portable/references/cli.md",
87
+ "sha256": "55ad759a920ed5bb683b0354739b7a929a0d733e987c6164977ea466ff606955"
88
+ },
89
+ {
90
+ "path": "references/portable/references/disavow.md",
91
+ "sha256": "47b4b335f7695209ad0758fc19f3b23b38792032a6850277e563a9b7d80eabf1"
92
+ },
93
+ {
94
+ "path": "references/portable/references/local-crm-draft-handoff.md",
95
+ "sha256": "b8e027add77f9bbd3c71990a8b3d8ec45e99ceae2b7f0d8eb33697cfcd0eae82"
96
+ },
97
+ {
98
+ "path": "references/portable/references/portable-ledger-handoff.md",
99
+ "sha256": "0942083b6d9c0c9604623536a7e7b9c44341c7cc5bfde74fa9abdffbf2fbcf62"
100
+ },
101
+ {
102
+ "path": "references/portable/references/reports.md",
103
+ "sha256": "4fc4791d03c7497f0193fb3d6b4114095aad4d551bb063c8c9e9c485f0c8ca56"
104
+ },
105
+ {
106
+ "path": "references/portable/scripts/agentlinkops.py",
107
+ "sha256": "91d541768f95e17c059396624c153ca86395bccfc565a8bf3470e2e006404e28"
108
+ },
109
+ {
110
+ "path": "references/portable/scripts/disavow.py",
111
+ "sha256": "cae36ad7d9e4aef27510975b4c15a66e5649250f6e76df7ca2bfb025a696432e"
112
+ },
113
+ {
114
+ "path": "references/portable/scripts/migrations/001_crm.sql",
115
+ "sha256": "049fbd38b05c5b8dbab00b6ebee5342b8ed5cf48f65fe6cc1bbf41330ceedf54"
116
+ },
117
+ {
118
+ "path": "references/portable/scripts/migrations/002_cloud_events.sql",
119
+ "sha256": "9040c607408ffd9a168bb3c30431846ddbc7a3429b2a30ba3ecafd4048ccc0c3"
120
+ },
121
+ {
122
+ "path": "references/portable/scripts/migrations/003_disavow.sql",
123
+ "sha256": "ff47da734afaff5ab364dc0ae53c3db58254d0a30ca5250de8172a67f8ec2772"
124
+ },
125
+ {
126
+ "path": "references/portable/scripts/migrations/004_placement_costs.sql",
127
+ "sha256": "e25732a3abd95d54320984068d9a4242ee2d0b89f6c70330a24f63bd0a3671a2"
128
+ },
129
+ {
130
+ "path": "references/portable/scripts/outreach-crm-draft.py",
131
+ "sha256": "f673603b4be3f20df44a9531191241ae2c2e44881b9d82f8fa42fba7c327da7a"
132
+ },
133
+ {
134
+ "path": "references/portable/scripts/portable-handoff.py",
135
+ "sha256": "c4aa4036b41f840bf4eebfbff1e8a6b441f2706d09e027d7eb4f746f4f7eee0d"
136
+ },
137
+ {
138
+ "path": "references/portable/scripts/report.py",
139
+ "sha256": "c7088c3314d0453d62e8a70f0c80f535b219b2ea127ca7d1c0731b216a9cb602"
140
+ },
141
+ {
142
+ "path": "references/portable/templates/campaigns.v1.json",
143
+ "sha256": "768e1610d64b82a4e5872c301eb2a537705821b2f01e9f2265c8056f7da4a496"
144
+ }
145
+ ],
146
+ "edges": [
147
+ {
148
+ "from": "references/portable/references/cli.md",
149
+ "target": "references/portable/references/disavow.md",
150
+ "kind": "required-bundled"
151
+ },
152
+ {
153
+ "from": "references/portable/references/cli.md",
154
+ "target": "references/portable/references/reports.md",
155
+ "kind": "required-bundled"
156
+ },
157
+ {
158
+ "from": "references/portable/references/cli.md",
159
+ "target": "references/portable/scripts/agentlinkops.py",
160
+ "kind": "required-bundled"
161
+ },
162
+ {
163
+ "from": "references/portable/references/cli.md",
164
+ "target": "references/portable/scripts/agentlinkops.py",
165
+ "kind": "required-bundled"
166
+ },
167
+ {
168
+ "from": "references/portable/references/cli.md",
169
+ "target": "references/portable/scripts/agentlinkops.py",
170
+ "kind": "required-bundled"
171
+ },
172
+ {
173
+ "from": "references/portable/references/cli.md",
174
+ "target": "references/portable/scripts/agentlinkops.py",
175
+ "kind": "required-bundled"
176
+ },
177
+ {
178
+ "from": "references/portable/references/cli.md",
179
+ "target": "references/portable/scripts/agentlinkops.py",
180
+ "kind": "required-bundled"
181
+ },
182
+ {
183
+ "from": "references/portable/references/cli.md",
184
+ "target": "references/portable/scripts/agentlinkops.py",
185
+ "kind": "required-bundled"
186
+ },
187
+ {
188
+ "from": "references/portable/references/cli.md",
189
+ "target": "references/portable/scripts/agentlinkops.py",
190
+ "kind": "required-bundled"
191
+ },
192
+ {
193
+ "from": "references/portable/references/cli.md",
194
+ "target": "references/portable/scripts/agentlinkops.py",
195
+ "kind": "required-bundled"
196
+ },
197
+ {
198
+ "from": "references/portable/references/disavow.md",
199
+ "target": "references/portable/scripts/agentlinkops.py",
200
+ "kind": "required-bundled"
201
+ },
202
+ {
203
+ "from": "references/portable/references/disavow.md",
204
+ "target": "references/portable/scripts/agentlinkops.py",
205
+ "kind": "required-bundled"
206
+ },
207
+ {
208
+ "from": "references/portable/references/disavow.md",
209
+ "target": "references/portable/scripts/agentlinkops.py",
210
+ "kind": "required-bundled"
211
+ },
212
+ {
213
+ "from": "references/portable/references/disavow.md",
214
+ "target": "references/portable/scripts/agentlinkops.py",
215
+ "kind": "required-bundled"
216
+ },
217
+ {
218
+ "from": "references/portable/references/disavow.md",
219
+ "target": "references/portable/scripts/agentlinkops.py",
220
+ "kind": "required-bundled"
221
+ },
222
+ {
223
+ "from": "references/portable/references/local-crm-draft-handoff.md",
224
+ "target": "references/portable/scripts/outreach-crm-draft.py",
225
+ "kind": "required-bundled"
226
+ },
227
+ {
228
+ "from": "references/portable/references/local-crm-draft-handoff.md",
229
+ "target": "references/portable/scripts/outreach-crm-draft.py",
230
+ "kind": "required-bundled"
231
+ },
232
+ {
233
+ "from": "references/portable/references/portable-ledger-handoff.md",
234
+ "target": "references/portable/scripts/portable-handoff.py",
235
+ "kind": "required-bundled"
236
+ },
237
+ {
238
+ "from": "references/portable/references/reports.md",
239
+ "target": "references/portable/scripts/agentlinkops.py",
240
+ "kind": "required-bundled"
241
+ },
242
+ {
243
+ "from": "references/portable/references/reports.md",
244
+ "target": "references/portable/scripts/agentlinkops.py",
245
+ "kind": "required-bundled"
246
+ },
247
+ {
248
+ "from": "references/portable/scripts/agentlinkops.py",
249
+ "target": "references/portable/scripts/disavow.py",
250
+ "kind": "required-bundled"
251
+ },
252
+ {
253
+ "from": "references/portable/scripts/agentlinkops.py",
254
+ "target": "references/portable/scripts/migrations/001_crm.sql",
255
+ "kind": "required-bundled"
256
+ },
257
+ {
258
+ "from": "references/portable/scripts/agentlinkops.py",
259
+ "target": "references/portable/scripts/report.py",
260
+ "kind": "required-bundled"
261
+ },
262
+ {
263
+ "from": "references/portable/scripts/agentlinkops.py",
264
+ "target": "references/portable/templates/campaigns.v1.json",
265
+ "kind": "required-bundled"
266
+ },
267
+ {
268
+ "from": "references/portable/scripts/outreach-crm-draft.py",
269
+ "target": "references/portable/scripts/portable-handoff.py",
270
+ "kind": "required-bundled"
271
+ },
272
+ {
273
+ "from": "references/portable/scripts/outreach-crm-draft.py",
274
+ "target": "references/portable/scripts/portable-handoff.py",
275
+ "kind": "required-bundled"
276
+ },
277
+ {
278
+ "from": "SKILL.md",
279
+ "target": "../../references/recipes/placement-reconciliation.md",
280
+ "kind": "optional-selected",
281
+ "selection": "agentlinkops agent setup --recipe placement-reconciliation"
282
+ },
283
+ {
284
+ "from": "SKILL.md",
285
+ "target": "references/portable/references/cli.md",
286
+ "kind": "required-bundled"
287
+ },
288
+ {
289
+ "from": "SKILL.md",
290
+ "target": "references/portable/references/cli.md",
291
+ "kind": "required-bundled"
292
+ },
293
+ {
294
+ "from": "SKILL.md",
295
+ "target": "references/portable/references/disavow.md",
296
+ "kind": "required-bundled"
297
+ },
298
+ {
299
+ "from": "SKILL.md",
300
+ "target": "references/portable/references/local-crm-draft-handoff.md",
301
+ "kind": "required-bundled"
302
+ },
303
+ {
304
+ "from": "SKILL.md",
305
+ "target": "references/portable/references/portable-ledger-handoff.md",
306
+ "kind": "required-bundled"
307
+ },
308
+ {
309
+ "from": "SKILL.md",
310
+ "target": "references/portable/references/reports.md",
311
+ "kind": "required-bundled"
312
+ },
313
+ {
314
+ "from": "SKILL.md",
315
+ "target": "references/portable/scripts/agentlinkops.py",
316
+ "kind": "required-bundled"
317
+ },
318
+ {
319
+ "from": "SKILL.md",
320
+ "target": "references/portable/scripts/agentlinkops.py",
321
+ "kind": "required-bundled"
322
+ },
323
+ {
324
+ "from": "SKILL.md",
325
+ "target": "references/portable/scripts/outreach-crm-draft.py",
326
+ "kind": "required-bundled"
327
+ }
328
+ ],
329
+ "externalRuntime": [
330
+ {
331
+ "kind": "external-runtime",
332
+ "id": "agentlinkops-cli",
333
+ "commands": [
334
+ "agentlinkops",
335
+ "linktrail",
336
+ "node cli/agentlinkops.mjs"
337
+ ],
338
+ "availability": "Install separately for a standalone skill; inspect the installed version and help before using a local command. Hosted discovery does not install local CLI features."
339
+ },
340
+ {
341
+ "kind": "external-runtime",
342
+ "id": "python-standard-library",
343
+ "minimumVersion": "3.10",
344
+ "imports": [
345
+ "argparse",
346
+ "contextlib",
347
+ "csv",
348
+ "datetime",
349
+ "decimal",
350
+ "errno",
351
+ "fcntl",
352
+ "hashlib",
353
+ "html",
354
+ "importlib",
355
+ "io",
356
+ "ipaddress",
357
+ "json",
358
+ "os",
359
+ "pathlib",
360
+ "re",
361
+ "sqlite3",
362
+ "stat",
363
+ "sys",
364
+ "tempfile",
365
+ "time",
366
+ "urllib"
367
+ ]
368
+ },
369
+ {
370
+ "kind": "external-runtime",
371
+ "id": "agentlinkops-hosted-mcp",
372
+ "availability": "Hosted commands require separately connected customer access and current catalog exposure. Installing a skill alone does not establish access."
373
+ }
374
+ ],
375
+ "privateExcluded": [
376
+ "private Fleet/account files",
377
+ "customer records and credentials",
378
+ "unselected or uncleared publisher material"
379
+ ],
380
+ "coverage": "Assembler records source hashes; independent archive verification recomputes required members, supported links/imports and declared resources. Optional selections and external runtimes remain separate."
381
+ }
@@ -1,26 +1,30 @@
1
1
  ---
2
2
  name: agentlinkops-crm
3
3
  description: Manage the AgentLinkOps local backlink and outreach CRM, user-selected disavow lists, branded HTML reports and cloud event sync. Use for durable campaign records, link reporting or explicit disavow-list management; does not connect a mailbox, send outreach or upload disavow files.
4
- allowed-tools: Read Bash(python3 ../../scripts/agentlinkops.py *) Bash(python3 ../../scripts/outreach-crm-draft.py *) Bash(node cli/agentlinkops.mjs *) Bash(agentlinkops *)
4
+ allowed-tools: Read Bash(python3 references/portable/scripts/agentlinkops.py *) Bash(python3 references/portable/scripts/outreach-crm-draft.py *) Bash(agentlinkops *)
5
5
  ---
6
6
 
7
- **For the optional bundled CLI, the local surface is the ledger file.** `.agentlinkops/links.jsonl` in the user's repository (or a `.linktrail/` directory from an earlier install, read until `agentlinkops migrate` renames it) declares the links they expect, want and have earned, and `agentlinkops check` runs the exact cloud verifier against it without an account. Run the CLI as `node cli/agentlinkops.mjs` from the repository or plugin-package root (`cli/linktrail.mjs` still works and prints a one-line notice); the packaged plugin ships the CLI, its pinned verifier modules and their pinned runtime dependencies inside the package, so the installed package needs no npm install; checking a publisher still requires a read-only network fetch. It needs Node 22 or newer (`adopt` reads SQLite databases through `node:sqlite`); the Python helper below needs Python 3.10+. This CRM is one optional adapter beside CSV and JSONL: it is available, tested and unchanged, and nothing requires it. When a user already keeps links here, `agentlinkops adopt <db>` reads it into ledger entries — read-only, adding no schema — and previews unless `--write` is given. Do not propose the CRM as the place a user should start keeping links; propose it when they want contacts and outreach activity beside them, or when they already have one.
7
+ **The CLI's local surface is the ledger file.** `.agentlinkops/links.jsonl` in the user's repository (or a `.linktrail/` directory from an earlier install, read until `agentlinkops migrate` renames it) declares the links they expect, want and have earned. `agentlinkops check` uses the shared verifier without an account; checking a publisher still requires a read-only network fetch.
8
+
9
+ The full plugin includes the CLI and its runtime dependencies. A standalone skill includes the Python helper and required references, but needs a separately installed CLI for ledger commands. Check `agentlinkops --version` and help before using local features; hosted command refresh does not install them. The CLI needs Node 22 or newer; the Python helper needs Python 3.10 or newer.
10
+
11
+ This CRM is an optional adapter beside CSV and JSONL. When a user already keeps links here, `agentlinkops adopt <db>` reads the database without changing its schema and previews ledger entries unless `--write` is given. Offer this CRM when the user wants contacts and outreach activity beside their links, or already has records in it.
8
12
 
9
13
  To record a link in the ledger: `agentlinkops add --source URL --target URL --intent expected [--anchor TEXT] [--ref ID] [--note TEXT]` (`--intent wanted` for a link not yet earned; `agentlinkops init` first in a repository without `.agentlinkops/`). `agentlinkops check` then verifies every expected link and returns 0 when no expected placement is conclusively absent, 1 when one is observed absent with complete evidence, 2 on a usage or ledger error. Unknown is nonfailing by default; `--fail-on-unknown` returns 1 for an unknown result in text or JSON output.
10
14
 
11
- Use the deterministic Python helper at `../../scripts/agentlinkops.py`, resolved relative to this skill's directory. It requires Python 3.10+ and only its standard library. Run `--help` for the command surface. Keep the database outside the plugin installation directory; updates can replace that directory.
15
+ Use the deterministic Python helper at `references/portable/scripts/agentlinkops.py`, resolved relative to this skill's directory. It requires Python 3.10+ and only its standard library. Run `--help` for the command surface. Keep the database outside the plugin installation directory; updates can replace that directory.
12
16
 
13
- Read [the CLI contract](../../references/cli.md) for fields and examples. The CRM contains products, campaigns, contacts, opportunities, activities and placements. Use explicit stable IDs and upsert a record to update it. Bulk records of one entity are committed together. Save source URLs and observed dates alongside contact and qualification evidence.
17
+ Read [the CLI contract](references/portable/references/cli.md) for fields and examples. The CRM contains products, campaigns, contacts, opportunities, activities and placements. Use explicit stable IDs and upsert a record to update it. Bulk records of one entity are committed together. Save source URLs and observed dates alongside contact and qualification evidence.
14
18
 
15
- When the user asks to manage a disavow list, read [the disavow contract](../../references/disavow.md). Scope every operation to the exact user-selected URL-prefix property. Preserve provenance and the user's explicit rule choices. Do not decide to disavow a site from a low score, inaccessible page or generic risk label. The helper imports and exports local files; it has no Google upload capability. Reimporting a prior file does not reactivate rules the user disabled.
19
+ When the user asks to manage a disavow list, read [the disavow contract](references/portable/references/disavow.md). Scope every operation to the exact user-selected URL-prefix property. Preserve provenance and the user's explicit rule choices. Do not decide to disavow a site from a low score, inaccessible page or generic risk label. The helper imports and exports local files; it has no Google upload capability. Reimporting a prior file does not reactivate rules the user disabled.
16
20
 
17
- For a shareable placement report, read [the report contract](../../references/reports.md). Select the requested project and brand/title. Reports include observed placement data by default. Include local notes or cost amounts only when the user requests that content; those fields may contain private commercial context. The output is self-contained HTML, not a generated PDF. A report timestamp does not make its underlying observations fresh.
21
+ For a shareable placement report, read [the report contract](references/portable/references/reports.md). Select the requested project and brand/title. Reports include observed placement data by default. Include local notes or cost amounts only when the user requests that content; those fields may contain private commercial context. The output is self-contained HTML, not a generated PDF. A report timestamp does not make its underlying observations fresh.
18
22
 
19
23
  Preserve an existing CRM's workspace binding. Never initialize over an unrelated database, rewrite migration checksums, delete data to resolve a migration error, or reset a sync cursor to hide an expired feed. The helper backs up existing databases before applying new migrations.
20
24
 
21
25
  Track outreach through `external_message_id`, activity kind, time and outcome. Keep email bodies and mailbox credentials in the user's existing email system. Local notes are not a secret store. CSV export neutralizes spreadsheet formula prefixes; JSON is the lossless interchange format.
22
26
 
23
- For ledger cloud setup, follow [Connect the ledger CLI](../../references/cli.md#connect-the-ledger-cli-to-an-existing-project): create a scoped credential in the workspace, supply it through the process environment, verify the existing project with `connect`, then review `sync --dry-run`. An explicit ledger-ID selection keeps unrelated local records out of uploads. MCP OAuth credentials stay in the MCP client.
27
+ For ledger cloud setup, follow [Connect the ledger CLI](references/portable/references/cli.md#connect-the-ledger-cli-to-an-existing-project): create a scoped credential in the workspace, supply it through the process environment, verify the existing project with `connect`, then review `sync --dry-run`. An explicit ledger-ID selection keeps unrelated local records out of uploads. MCP OAuth credentials stay in the MCP client.
24
28
 
25
29
  For recurring cloud changes, use the host's already connected AgentLinkOps tools when available. The standalone `sync` helper requires `AGENTLINKOPS_API_URL` and `AGENTLINKOPS_API_KEY` in its process environment (the `LINKTRAIL_` spellings are still accepted with a warning during the pilot compatibility window). Never request a key in chat or place it in command arguments, source files or CRM notes. Account connection and permissions are separate from local CRM utility. Explain unavailable access neutrally and preserve completed local work.
26
30
 
@@ -29,7 +33,7 @@ Sync updates `cloud_state` on placements and preserves local status, notes and o
29
33
  Recipes are optional. Choose `agentlinkops agent setup --recipe placement-reconciliation` before reading `../../references/recipes/placement-reconciliation.md` for an exact source and destination, retained evidence, checkpoints and optional monitoring. Removing the recipe preserves your local records and existing reconciliation process.
30
34
 
31
35
  For a draft-only file from an existing frozen report, read [portable ledger
32
- handoff](../../references/portable-ledger-handoff.md). It needs explicit customer
36
+ handoff](references/portable/references/portable-ledger-handoff.md). It needs explicit customer
33
37
  workspace/project/site and external-ID mappings, verifies the report hash and
34
38
  refuses mismatched sites or conflicting output. It does not verify hosted grants,
35
39
  import into a vendor or send messages. Keep replied, suppressed and unknown facts
@@ -37,7 +41,20 @@ separate from monitoring state; a saved file does not establish destination
37
41
  readback or permission to send.
38
42
 
39
43
  When the user selects an existing local Outreach CRM with `projects/<project>/drafts`,
40
- use [local CRM draft handoff](../../references/local-crm-draft-handoff.md) for exact
44
+ use [local CRM draft handoff](references/portable/references/local-crm-draft-handoff.md) for exact
41
45
  body/manifest saving, interrupted-save recovery and readback. This adapter preserves
42
46
  the complete original request and explicit site binding. It does not import contacts,
43
47
  check current sender authority, activate sequences or provide a native vendor API.
48
+
49
+ ## Several recipients on one hosted opportunity
50
+
51
+ When the authenticated catalog lists `save_campaign_participation` and
52
+ `record_campaign_participation_outcome`, the limited operator pilot can bind each
53
+ recipient's saved contact, campaign and opaque source record to one existing
54
+ opportunity. Read the participation and contact revisions before recording a dated
55
+ source event. Reuse the event identity after interruption and read the saved result.
56
+ A recipient reply or decline concerns that recipient; independent placement evidence
57
+ and monitoring remain on the shared opportunity. Preserve its saved contact association and
58
+ legacy reference. Do not duplicate watches or invent source URLs. If these commands
59
+ are absent, keep the additional recipient records in the current CRM and report the
60
+ held mapping. Sender credentials, bodies, sequences and suppression stay external.
@@ -1,6 +1,6 @@
1
1
  interface:
2
2
  display_name: AgentLinkOps CRM
3
- short_description: Manage the AgentLinkOps local backlink and outreach CRM, user-selected disavow lists, branded HTML reports and cloud eve
3
+ short_description: "Manage local CRM, disavow lists, reports and cloud event sync"
4
4
  policy:
5
5
  allow_implicit_invocation: true
6
6
  dependencies: