agentlinkops 0.6.2 → 0.6.4
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 +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/CHANGELOG.md +15 -1
- package/cli/admission.js +130 -0
- package/cli/agent-setup.js +1014 -101
- package/cli/catalog.js +5742 -0
- package/cli/citation.js +1 -1
- package/cli/client.js +1 -1
- package/cli/commands.js +3 -3
- package/cli/config.js +2 -1
- package/cli/disavow.js +54 -0
- package/cli/doctor.js +7 -8
- package/cli/index-observations.js +15 -1
- package/cli/index-submissions.js +50 -0
- package/cli/ledger.js +7 -1
- package/cli/lifecycle.js +40 -0
- package/cli/main.js +19 -4
- package/cli/sync.js +18 -0
- package/package.json +1 -1
- package/references/recipes/catalog.json +148 -0
- package/references/recipes/command-notes.md +9 -0
- package/references/recipes/placement-reconciliation.md +41 -0
- package/references/recipes/qualified-campaign-handoff.md +56 -0
- package/references/recipes/site-context-brief.md +25 -0
- package/references/recipes/sourced-linkable-asset.md +25 -0
- package/shared/admission-contract.js +16 -0
- package/shared/admission-report-contract.js +8 -0
- package/shared/disavow-contract.js +18 -0
- package/shared/lifecycle-contract.js +22 -0
- package/shared/lifecycle-money.js +24 -0
- package/shared/response-contract.js +2 -0
- package/skills/agentlinkops-assets/SKILL.md +2 -0
- package/skills/agentlinkops-campaigns/SKILL.md +2 -0
- package/skills/agentlinkops-connect/SKILL.md +4 -0
- package/skills/agentlinkops-connect/references/agentlinkops.md +8 -4
- package/skills/agentlinkops-crm/SKILL.md +2 -0
- package/src/tool-views.js +6 -2
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agentlinkops",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.4",
|
|
4
4
|
"description": "Connect an agent to AgentLinkOps and run backlink work with it: the connect skill (views, the three discovery verbs, evidence rules), local ledger and campaign skills, a portable CRM, the source-cited content pipeline, user-managed disavow lists, HTML reports and monitoring-event sync.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "AgentLinkOps"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agentlinkops",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.4",
|
|
4
4
|
"description": "Connect an agent to AgentLinkOps and run backlink work with it: the connect skill (views, the three discovery verbs, evidence rules), local ledger and campaign skills, a portable CRM, the source-cited content pipeline, user-managed disavow lists, HTML reports and monitoring-event sync.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "AgentLinkOps"
|
package/CHANGELOG.md
CHANGED
|
@@ -3,7 +3,21 @@
|
|
|
3
3
|
All notable changes to the `agentlinkops` package are recorded here. The version follows the
|
|
4
4
|
plugin manifests in `.claude-plugin/` and `.codex-plugin/`.
|
|
5
5
|
|
|
6
|
-
## 0.6.
|
|
6
|
+
## 0.6.4 (2026-09-20)
|
|
7
|
+
|
|
8
|
+
- Import and export immutable local IndexNow submission receipts, with hashes and replay checks. These commands send no submissions.
|
|
9
|
+
- Join each submission attempt to later retained index observations for the exact URL and project. JSON and CSV preserve source, date, reason and unknown results.
|
|
10
|
+
- Submission responses remain received, validation pending, failed or unknown. Later Google observations do not verify indexing by an IndexNow participant or establish that submission caused indexing.
|
|
11
|
+
|
|
12
|
+
## 0.6.3 (2026-09-20)
|
|
13
|
+
|
|
14
|
+
- Agent installation preserves customer edits and supports previewed removal and interrupted-install recovery.
|
|
15
|
+
- Four versioned recipes ship within the existing five product skills, with native Codex discovery and bounded recovery evaluation.
|
|
16
|
+
- Admission and disavow commands expose rule checks, retained decisions and deterministic customer-owned exports. Approval requires a signed-in owner or administrator.
|
|
17
|
+
- Lifecycle commands retain supplied deal metadata in currency minor units. Explicit lifecycle sync mirrors hosted facts without overwriting the local ledger.
|
|
18
|
+
- The command catalog includes retained profile distributions, per-widget exports and historical link location evidence. Unknown evidence remains unknown.
|
|
19
|
+
|
|
20
|
+
## 0.6.2 (2026-09-20)
|
|
7
21
|
|
|
8
22
|
- Citation panels support competitor targets and explicit locale contexts. New panels default to the free mock engine; prompt suggestions remain editable.
|
|
9
23
|
- Citation reports show bounded epoch history, retained evidence and unknown results. Local cadence commands preserve configured paths and require explicit webhook opt-in.
|
package/cli/admission.js
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import * as R from '../shared/admission-report-contract.js';
|
|
2
|
+
import { parseArgs } from "./args.js";
|
|
3
|
+
import { ConfigError } from "./config.js";
|
|
4
|
+
import * as C from "../shared/admission-contract.js";
|
|
5
|
+
|
|
6
|
+
// The caller supplies its already configured scoped client; this module never
|
|
7
|
+
// reads credentials or falls back to a different project.
|
|
8
|
+
const operations = {
|
|
9
|
+
reevaluate:{name:'reevaluate_admission',input:R.admissionReevaluateInput,output:R.admissionReevaluateOutput,flags:['source','limit','cursor']},
|
|
10
|
+
receipt:{name:'get_admission_decisions',input:R.admissionReceiptInput,output:R.admissionReceiptOutput,flags:['id']},
|
|
11
|
+
list: {
|
|
12
|
+
name: "list_admission_rules",
|
|
13
|
+
input: C.admissionListInput,
|
|
14
|
+
output: C.admissionListOutput,
|
|
15
|
+
flags: ["limit", "cursor"],
|
|
16
|
+
},
|
|
17
|
+
add: {
|
|
18
|
+
name: "add_admission_rule",
|
|
19
|
+
input: C.admissionRuleInput,
|
|
20
|
+
output: C.admissionMutationOutput,
|
|
21
|
+
flags: ["kind", "value", "note", "disabled"],
|
|
22
|
+
},
|
|
23
|
+
update: {
|
|
24
|
+
name: "update_admission_rule",
|
|
25
|
+
input: C.admissionUpdateInput,
|
|
26
|
+
output: C.admissionMutationOutput,
|
|
27
|
+
flags: ["id", "revision", "value", "note", "enable", "disable"],
|
|
28
|
+
},
|
|
29
|
+
remove: {
|
|
30
|
+
name: "delete_admission_rule",
|
|
31
|
+
input: C.admissionDeleteInput,
|
|
32
|
+
output: C.admissionDeleteOutput,
|
|
33
|
+
flags: ["id", "revision", "apply"],
|
|
34
|
+
},
|
|
35
|
+
evaluate: {
|
|
36
|
+
name: "evaluate_admission",
|
|
37
|
+
input: C.admissionEvaluateInput,
|
|
38
|
+
output: C.admissionEvaluateOutput,
|
|
39
|
+
flags: ["url", "context"],
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
export async function admissionMain(
|
|
43
|
+
argv,
|
|
44
|
+
{ client, out = console.log, err = console.error } = {},
|
|
45
|
+
) {
|
|
46
|
+
try {
|
|
47
|
+
const seen = new Set();
|
|
48
|
+
for (const token of argv.filter((a) => a.startsWith("--"))) {
|
|
49
|
+
const name = token.slice(2).split("=")[0];
|
|
50
|
+
if (seen.has(name) && name !== "url")
|
|
51
|
+
throw new ConfigError("Duplicate admission option.");
|
|
52
|
+
seen.add(name);
|
|
53
|
+
}
|
|
54
|
+
const a = parseArgs(argv, ["url"]),
|
|
55
|
+
op = operations[a._[0]];
|
|
56
|
+
if (
|
|
57
|
+
!op ||
|
|
58
|
+
a._.length !== 1 ||
|
|
59
|
+
Object.keys(a).some(
|
|
60
|
+
(k) => !["_", "project", "json", ...op.flags].includes(k),
|
|
61
|
+
)
|
|
62
|
+
)
|
|
63
|
+
throw new ConfigError(
|
|
64
|
+
"Use admission list|add|update|remove|evaluate|reevaluate|receipt with --project and explicit rule arguments.",
|
|
65
|
+
);
|
|
66
|
+
for (const flag of ["json", "disabled", "enable", "disable", "apply"])
|
|
67
|
+
if (a[flag] !== undefined && a[flag] !== true)
|
|
68
|
+
throw new ConfigError(`--${flag} takes no value.`);
|
|
69
|
+
if (a.enable && a.disable)
|
|
70
|
+
throw new ConfigError("Choose --enable or --disable, not both.");
|
|
71
|
+
const body = { projectId: a.project };
|
|
72
|
+
if (["list","reevaluate"].includes(a._[0])) {
|
|
73
|
+
if (a.limit !== undefined) body.limit = Number(a.limit);
|
|
74
|
+
if (a.cursor !== undefined) body.cursor = a.cursor;
|
|
75
|
+
}
|
|
76
|
+
if (a._[0] === "add") {
|
|
77
|
+
Object.assign(body, { kind: a.kind, value: a.value });
|
|
78
|
+
if (a.disabled) body.enabled = false;
|
|
79
|
+
}
|
|
80
|
+
if (["add", "update"].includes(a._[0])) {
|
|
81
|
+
if (a.note !== undefined) body.note = a.note;
|
|
82
|
+
if (a.value !== undefined) body.value = a.value;
|
|
83
|
+
}
|
|
84
|
+
if (["update", "remove"].includes(a._[0]))
|
|
85
|
+
Object.assign(body, { ruleId: a.id, revision: Number(a.revision) });
|
|
86
|
+
if (a._[0] === "update") {
|
|
87
|
+
if (a.enable || a.disable) body.enabled = !!a.enable;
|
|
88
|
+
if (
|
|
89
|
+
a.value === undefined &&
|
|
90
|
+
a.note === undefined &&
|
|
91
|
+
!a.enable &&
|
|
92
|
+
!a.disable
|
|
93
|
+
)
|
|
94
|
+
throw new ConfigError(
|
|
95
|
+
"An update requires a changed value, note or enabled state.",
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
if (a._[0] === "remove" && a.apply !== true)
|
|
99
|
+
throw new ConfigError(
|
|
100
|
+
"Removal requires --apply and the reviewed rule revision.",
|
|
101
|
+
);
|
|
102
|
+
if (a._[0] === "evaluate") {
|
|
103
|
+
body.urls = a.url;
|
|
104
|
+
if (a.context !== undefined) body.context = a.context;
|
|
105
|
+
}
|
|
106
|
+
if(a._[0]==='reevaluate')body.source=a.source;
|
|
107
|
+
if(a._[0]==='receipt')body.operationId=a.id;
|
|
108
|
+
const parsed = op.input.safeParse(body);
|
|
109
|
+
if (!parsed.success)
|
|
110
|
+
throw new ConfigError(
|
|
111
|
+
"Invalid admission arguments; project, bounds, kind and revision must match the command contract.",
|
|
112
|
+
);
|
|
113
|
+
if (!client || typeof client.callCommand !== "function")
|
|
114
|
+
throw new ConfigError(
|
|
115
|
+
"Admission requires a configured scoped cloud client.",
|
|
116
|
+
);
|
|
117
|
+
const result = op.output.safeParse(
|
|
118
|
+
await client.callCommand(op.name, parsed.data),
|
|
119
|
+
);
|
|
120
|
+
if (!result.success)
|
|
121
|
+
throw new ConfigError(
|
|
122
|
+
"Invalid admission response; no result was accepted.",
|
|
123
|
+
);
|
|
124
|
+
out(JSON.stringify(result.data, null, 2));
|
|
125
|
+
return 0;
|
|
126
|
+
} catch (error) {
|
|
127
|
+
err(error?.code ? `${error.code}: ${error.message}` : error.message);
|
|
128
|
+
return 2;
|
|
129
|
+
}
|
|
130
|
+
}
|