@agentsean/launch 1.0.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.
- package/LICENSE +661 -0
- package/dist/doctor.d.ts +30 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +170 -0
- package/dist/doctor.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/install.d.ts +22 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +42 -0
- package/dist/install.js.map +1 -0
- package/dist/onboard.d.ts +21 -0
- package/dist/onboard.d.ts.map +1 -0
- package/dist/onboard.js +59 -0
- package/dist/onboard.js.map +1 -0
- package/dist/provision.d.ts +13 -0
- package/dist/provision.d.ts.map +1 -0
- package/dist/provision.js +52 -0
- package/dist/provision.js.map +1 -0
- package/dist/recipes.d.ts +11 -0
- package/dist/recipes.d.ts.map +1 -0
- package/dist/recipes.js +225 -0
- package/dist/recipes.js.map +1 -0
- package/dist/service.d.ts +22 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +127 -0
- package/dist/service.js.map +1 -0
- package/dist/site.d.ts +9 -0
- package/dist/site.d.ts.map +1 -0
- package/dist/site.js +72 -0
- package/dist/site.js.map +1 -0
- package/dist/telemetry.d.ts +38 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +146 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/token-strength.d.ts +9 -0
- package/dist/token-strength.d.ts.map +1 -0
- package/dist/token-strength.js +22 -0
- package/dist/token-strength.js.map +1 -0
- package/dist/update.d.ts +15 -0
- package/dist/update.d.ts.map +1 -0
- package/dist/update.js +31 -0
- package/dist/update.js.map +1 -0
- package/dist/version.d.ts +8 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +15 -0
- package/dist/version.js.map +1 -0
- package/package.json +47 -0
package/dist/recipes.js
ADDED
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
export const RECIPES = [
|
|
2
|
+
{
|
|
3
|
+
id: "fix-title-tags-wordpress",
|
|
4
|
+
title: "Fix title tags on WordPress",
|
|
5
|
+
summary: "Sean writes unique titles through the companion plugin, verifies live HTML, and stores a revert snapshot.",
|
|
6
|
+
cms: ["wordpress"],
|
|
7
|
+
href: "/recipes/fix-title-tags-wordpress.html",
|
|
8
|
+
steps: [
|
|
9
|
+
"Install sean-bridge and create an Application Password.",
|
|
10
|
+
"sean connect wordpress --api-key USER:APP_PASSWORD https://example.com",
|
|
11
|
+
"sean apply — T1 title-tag Actions apply automatically after the observe window.",
|
|
12
|
+
"Click Revert on any change. The shadow ledger restores the previous post meta.",
|
|
13
|
+
],
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
id: "fix-orphaned-pages-shopify",
|
|
17
|
+
title: "Fix orphaned pages on a Shopify store",
|
|
18
|
+
summary: "Internal-link Actions go to metafields. Theme writes are refused — Shopify write_themes stays denied.",
|
|
19
|
+
cms: ["shopify"],
|
|
20
|
+
href: "/recipes/fix-orphaned-pages-shopify.html",
|
|
21
|
+
steps: [
|
|
22
|
+
"sean connect shopify --api-key shpat_… mystore.myshopify.com",
|
|
23
|
+
"Sean lists pages with zero inbound links from the crawl graph.",
|
|
24
|
+
"An Action proposes a metafield + a merchant-pasted snippet. Sean never writes the theme.",
|
|
25
|
+
"Verify-by-refetch. Revert restores the previous metafield value.",
|
|
26
|
+
],
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
id: "git-pr-title-tags-nextjs",
|
|
30
|
+
title: "Open a Git PR for Next.js title tags",
|
|
31
|
+
summary: "The git adapter writes a reviewable diff against the customer's source of truth.",
|
|
32
|
+
cms: ["git"],
|
|
33
|
+
href: "/recipes/git-pr-title-tags-nextjs.html",
|
|
34
|
+
steps: [
|
|
35
|
+
"sean apply --repo ./my-next-app",
|
|
36
|
+
"Sean plans title-tag Actions, runs the 15-check validator, opens a PR.",
|
|
37
|
+
"Merge is yours. Revert is another PR from the shadow-ledger snapshot.",
|
|
38
|
+
],
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
id: "refresh-decaying-content",
|
|
42
|
+
title: "Refresh a decaying page",
|
|
43
|
+
summary: "Daily, Sean picks a page whose GSC clicks are falling, rewrites it, runs PublishGate, and publishes. 2 refreshes/day, not overridable.",
|
|
44
|
+
cms: ["wordpress", "git", "shopify"],
|
|
45
|
+
href: "/recipes/refresh-decaying-content.html",
|
|
46
|
+
steps: [
|
|
47
|
+
"Connect Google so clicks exist. Default metric is clicks.",
|
|
48
|
+
"sean content — or wait for the daily job.",
|
|
49
|
+
"PublishGate refuses YMYL, affiliate, and thin rewrites.",
|
|
50
|
+
"newPagesPerDay=2 and contentRefreshPerDay=2 cannot be raised.",
|
|
51
|
+
],
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
id: "faq-schema-from-gsc",
|
|
55
|
+
title: "FAQ schema from Search Console queries",
|
|
56
|
+
summary: "Schema is a check, not an AEO lever. Sean will not sell llms.txt, word count, or FAQ schema as AI-citation tactics.",
|
|
57
|
+
cms: ["wordpress", "git"],
|
|
58
|
+
href: "/recipes/faq-schema-from-gsc.html",
|
|
59
|
+
steps: [
|
|
60
|
+
"Pull GSC queries for a URL.",
|
|
61
|
+
"If the page already answers them, Sean may add FAQPage JSON-LD.",
|
|
62
|
+
"If it does not, Sean refreshes the copy first. Schema without the answer is refused.",
|
|
63
|
+
],
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
id: "internal-links-pillar",
|
|
67
|
+
title: "Build internal links into a pillar page",
|
|
68
|
+
summary: "Deterministic graph, not an LLM with write credentials.",
|
|
69
|
+
cms: ["wordpress", "git", "shopify"],
|
|
70
|
+
href: "/recipes/internal-links-pillar.html",
|
|
71
|
+
steps: [
|
|
72
|
+
"Crawl produces the link graph.",
|
|
73
|
+
"Sean queues T2 internal-link Actions onto relevant pages.",
|
|
74
|
+
"Each apply is verified by re-fetching live HTML.",
|
|
75
|
+
],
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
id: "gbp-local-pack",
|
|
79
|
+
title: "Keep a Google Business Profile inside quota",
|
|
80
|
+
summary: "10 edits/min, 300 QPM, and 0 QPM until the location is approved. Sean will not generate reviews (T4).",
|
|
81
|
+
cms: ["other"],
|
|
82
|
+
href: "/recipes/gbp-local-pack.html",
|
|
83
|
+
steps: [
|
|
84
|
+
"sean local — detect the GBP and the quota remaining.",
|
|
85
|
+
"Safe edits (hours, categories) apply; review generation is refused.",
|
|
86
|
+
"City×service pages are T4 and are not created unbounded.",
|
|
87
|
+
],
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
id: "ai-citation-share",
|
|
91
|
+
title: "Measure AI citation share",
|
|
92
|
+
summary: "~$1.11/run across ~20 prompts × 2 engines. Training crawlers ≠ citation crawlers. Schema and llms.txt are not sold as levers.",
|
|
93
|
+
cms: ["other"],
|
|
94
|
+
href: "/recipes/ai-citation-share.html",
|
|
95
|
+
steps: [
|
|
96
|
+
"sean visibility",
|
|
97
|
+
"Bing Webmaster AI CSV is import-only — there is no API.",
|
|
98
|
+
"robots.txt is checked for accidental training-crawler blocks vs citation-crawler blocks.",
|
|
99
|
+
],
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
id: "brand-mentions-outreach",
|
|
103
|
+
title: "Mention-first outreach",
|
|
104
|
+
summary: "Find unlinked brand mentions. Sending email is T3 two-key. Sean does not buy links.",
|
|
105
|
+
cms: ["other"],
|
|
106
|
+
href: "/recipes/brand-mentions-outreach.html",
|
|
107
|
+
steps: [
|
|
108
|
+
"sean mentions",
|
|
109
|
+
"Review the draft. Two-key send is not overridable.",
|
|
110
|
+
"T4 review generation and paid placements are refused.",
|
|
111
|
+
],
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
id: "cloudflare-edge-squarespace",
|
|
115
|
+
title: "Edge overlay for Squarespace / Framer / Duda",
|
|
116
|
+
summary: "The worker never branches on user-agent. That is the cloaking line.",
|
|
117
|
+
cms: ["cloudflare"],
|
|
118
|
+
href: "/recipes/cloudflare-edge-squarespace.html",
|
|
119
|
+
steps: [
|
|
120
|
+
"sean connect cloudflare",
|
|
121
|
+
"Title-tag overlays apply to HTML for every client.",
|
|
122
|
+
"A crawler-only branch is a bug. Tests assert one response.",
|
|
123
|
+
],
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
id: "revert-a-change",
|
|
127
|
+
title: "Revert a live change",
|
|
128
|
+
summary: "Every write has a before-snapshot. One click, or sean revert <id>.",
|
|
129
|
+
cms: ["wordpress", "shopify", "git", "cloudflare"],
|
|
130
|
+
href: "/recipes/revert-a-change.html",
|
|
131
|
+
steps: [
|
|
132
|
+
"Open Activity. Every applied Action has Revert.",
|
|
133
|
+
"sean revert <changeId>",
|
|
134
|
+
"Verify-by-refetch confirms the old HTML is back.",
|
|
135
|
+
],
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
id: "freeze-writes",
|
|
139
|
+
title: "Freeze every write",
|
|
140
|
+
summary: "sean freeze writes HALT and survives restart. The kill switch is the product.",
|
|
141
|
+
cms: ["other"],
|
|
142
|
+
href: "/recipes/freeze-writes.html",
|
|
143
|
+
steps: [
|
|
144
|
+
"sean freeze",
|
|
145
|
+
"Confirm the dashboard banner.",
|
|
146
|
+
"sean unfreeze when ready.",
|
|
147
|
+
],
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
id: "observe-then-apply",
|
|
151
|
+
title: "Observe, then apply",
|
|
152
|
+
summary: "7-day observe-only on a new site, shortenable to 24h, not to zero.",
|
|
153
|
+
cms: ["other"],
|
|
154
|
+
href: "/recipes/observe-then-apply.html",
|
|
155
|
+
steps: [
|
|
156
|
+
"Onboard a site. Auto-apply waits out observeUntil.",
|
|
157
|
+
"Settings will not accept observeDays: 0.",
|
|
158
|
+
"T3 still needs two keys after the window.",
|
|
159
|
+
],
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
id: "bing-volume-no-paid-key",
|
|
163
|
+
title: "Keyword volume with zero paid keys",
|
|
164
|
+
summary: "GSC + Bing + autocomplete. Sean never scrapes Google.",
|
|
165
|
+
cms: ["other"],
|
|
166
|
+
href: "/recipes/bing-volume-no-paid-key.html",
|
|
167
|
+
steps: [
|
|
168
|
+
"sean keywords",
|
|
169
|
+
"DataForSEO is an upgrade for rank tracking, not a requirement.",
|
|
170
|
+
"Default metric is clicks. Impressions 2025-05-13 to 2026-04-27 are contaminated.",
|
|
171
|
+
],
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
id: "evidence-tier-report",
|
|
175
|
+
title: "Report with an evidence tier",
|
|
176
|
+
summary: "Causation only at tier A. Small sites mostly land in E — applied, not measurable.",
|
|
177
|
+
cms: ["other"],
|
|
178
|
+
href: "/recipes/evidence-tier-report.html",
|
|
179
|
+
steps: [
|
|
180
|
+
"sean measure",
|
|
181
|
+
"Every claim carries A–E.",
|
|
182
|
+
"Sean will not claim a ranking lift it cannot support.",
|
|
183
|
+
],
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
id: "connect-google-byo",
|
|
187
|
+
title: "Bring your own Google Cloud project",
|
|
188
|
+
summary: "The hosted broker never talks to this machine. --byo publishes to Production on your project.",
|
|
189
|
+
cms: ["other"],
|
|
190
|
+
href: "/recipes/connect-google-byo.html",
|
|
191
|
+
steps: [
|
|
192
|
+
"sean connect google --byo --credentials ./client_secret.json",
|
|
193
|
+
"The dashboard at 127.0.0.1:7777/connect runs the loopback OAuth dance.",
|
|
194
|
+
"Sensitive-scope, not CASA.",
|
|
195
|
+
],
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
id: "agency-ten-sites",
|
|
199
|
+
title: "Run ten client sites on Agency",
|
|
200
|
+
summary: "Cloud Agency is $249/mo for 25–50 sites. Hosted never stores CMS write credentials.",
|
|
201
|
+
cms: ["other"],
|
|
202
|
+
href: "/recipes/agency-ten-sites.html",
|
|
203
|
+
steps: [
|
|
204
|
+
"sean signup agency",
|
|
205
|
+
"Pair a customer-side connector per site.",
|
|
206
|
+
"sean tenant — per-tenant cost visibility.",
|
|
207
|
+
],
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
id: "city-service-pages-refused",
|
|
211
|
+
title: "City × service pages are refused",
|
|
212
|
+
summary: "Unbounded location pages are T4. The honest recipe is: do not do this.",
|
|
213
|
+
cms: ["other"],
|
|
214
|
+
href: "/recipes/city-service-pages-refused.html",
|
|
215
|
+
steps: [
|
|
216
|
+
"A request to create_city_service_page is refused.",
|
|
217
|
+
"Use GBP + a handful of real location pages you will maintain.",
|
|
218
|
+
"Scaled location spam is how sites earn a manual action.",
|
|
219
|
+
],
|
|
220
|
+
},
|
|
221
|
+
];
|
|
222
|
+
export function recipeById(id) {
|
|
223
|
+
return RECIPES.find((r) => r.id === id);
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=recipes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recipes.js","sourceRoot":"","sources":["../src/recipes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export type ServiceKind = "systemd-user" | "launchd" | "schtasks";
|
|
2
|
+
export declare function serviceKind(platform?: string): ServiceKind;
|
|
3
|
+
export type ServicePlan = {
|
|
4
|
+
kind: ServiceKind;
|
|
5
|
+
path: string;
|
|
6
|
+
contents: string;
|
|
7
|
+
enable: string[];
|
|
8
|
+
disable: string[];
|
|
9
|
+
summary: string;
|
|
10
|
+
};
|
|
11
|
+
export type ServicePlanInput = {
|
|
12
|
+
home: string;
|
|
13
|
+
nodePath: string;
|
|
14
|
+
daemonEntry: string;
|
|
15
|
+
host?: string | undefined;
|
|
16
|
+
port?: number | undefined;
|
|
17
|
+
platform?: string | undefined;
|
|
18
|
+
};
|
|
19
|
+
export declare function planService(input: ServicePlanInput): ServicePlan;
|
|
20
|
+
export declare function writeService(plan: ServicePlan): void;
|
|
21
|
+
export declare function removeServiceFile(plan: ServicePlan): void;
|
|
22
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,WAAW,GAAG,cAAc,GAAG,SAAS,GAAG,UAAU,CAAC;AAElE,wBAAgB,WAAW,CAAC,QAAQ,GAAE,MAAyB,GAAG,WAAW,CAI5E;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B,CAAC;AAEF,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,WAAW,CAoGhE;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAGpD;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAEzD"}
|
package/dist/service.js
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
export function serviceKind(platform = process.platform) {
|
|
5
|
+
if (platform === "darwin")
|
|
6
|
+
return "launchd";
|
|
7
|
+
if (platform === "win32")
|
|
8
|
+
return "schtasks";
|
|
9
|
+
return "systemd-user";
|
|
10
|
+
}
|
|
11
|
+
export function planService(input) {
|
|
12
|
+
const host = input.host ?? "127.0.0.1";
|
|
13
|
+
const port = input.port ?? 7777;
|
|
14
|
+
if (host !== "127.0.0.1" && host !== "localhost" && host !== "::1") {
|
|
15
|
+
throw new Error(`Refusing to install a service that binds ${host}. The user unit is loopback-only. Use Tailscale Serve for remote access.`);
|
|
16
|
+
}
|
|
17
|
+
const kind = serviceKind(input.platform ?? process.platform);
|
|
18
|
+
const nodePath = input.nodePath;
|
|
19
|
+
const entry = input.daemonEntry;
|
|
20
|
+
const home = input.home;
|
|
21
|
+
if (kind === "launchd") {
|
|
22
|
+
const plist = path.join(os.homedir(), "Library/LaunchAgents/dev.agentsean.plist");
|
|
23
|
+
const contents = `<?xml version="1.0" encoding="UTF-8"?>
|
|
24
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
25
|
+
<plist version="1.0">
|
|
26
|
+
<dict>
|
|
27
|
+
<key>Label</key><string>dev.agentsean</string>
|
|
28
|
+
<key>ProgramArguments</key>
|
|
29
|
+
<array>
|
|
30
|
+
<string>${escapeXml(nodePath)}</string>
|
|
31
|
+
<string>${escapeXml(entry)}</string>
|
|
32
|
+
<string>--host</string><string>127.0.0.1</string>
|
|
33
|
+
<string>--port</string><string>${port}</string>
|
|
34
|
+
<string>--home</string><string>${escapeXml(home)}</string>
|
|
35
|
+
</array>
|
|
36
|
+
<key>EnvironmentVariables</key>
|
|
37
|
+
<dict>
|
|
38
|
+
<key>SEAN_HOME</key><string>${escapeXml(home)}</string>
|
|
39
|
+
</dict>
|
|
40
|
+
<key>RunAtLoad</key><true/>
|
|
41
|
+
<key>KeepAlive</key><true/>
|
|
42
|
+
<key>StandardOutPath</key><string>${escapeXml(path.join(home, "daemon.log"))}</string>
|
|
43
|
+
<key>StandardErrorPath</key><string>${escapeXml(path.join(home, "daemon.log"))}</string>
|
|
44
|
+
</dict>
|
|
45
|
+
</plist>
|
|
46
|
+
`;
|
|
47
|
+
return {
|
|
48
|
+
kind,
|
|
49
|
+
path: plist,
|
|
50
|
+
contents,
|
|
51
|
+
enable: ["launchctl", "load", plist],
|
|
52
|
+
disable: ["launchctl", "unload", plist],
|
|
53
|
+
summary: `macOS LaunchAgent\n write ${plist}\n launchctl load ${plist}\n bind 127.0.0.1:${port}\n SEAN_HOME=${home}`,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
if (kind === "schtasks") {
|
|
57
|
+
const xmlPath = path.join(home, "agentsean.schtasks.xml");
|
|
58
|
+
const tr = `"${nodePath}" "${entry}" --host 127.0.0.1 --port ${port} --home "${home}"`;
|
|
59
|
+
const contents = `<?xml version="1.0" encoding="UTF-16"?>
|
|
60
|
+
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
|
|
61
|
+
<RegistrationInfo><Description>Agent Sean</Description></RegistrationInfo>
|
|
62
|
+
<Triggers><LogonTrigger><Enabled>true</Enabled></LogonTrigger></Triggers>
|
|
63
|
+
<Actions Context="Author">
|
|
64
|
+
<Exec>
|
|
65
|
+
<Command>${escapeXml(nodePath)}</Command>
|
|
66
|
+
<Arguments>${escapeXml(`"${entry}" --host 127.0.0.1 --port ${port} --home "${home}"`)}</Arguments>
|
|
67
|
+
</Exec>
|
|
68
|
+
</Actions>
|
|
69
|
+
<Settings><MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy></Settings>
|
|
70
|
+
</Task>
|
|
71
|
+
`;
|
|
72
|
+
return {
|
|
73
|
+
kind,
|
|
74
|
+
path: xmlPath,
|
|
75
|
+
contents,
|
|
76
|
+
enable: ["schtasks", "/Create", "/TN", "AgentSean", "/XML", xmlPath, "/F"],
|
|
77
|
+
disable: ["schtasks", "/Delete", "/TN", "AgentSean", "/F"],
|
|
78
|
+
summary: `Windows Scheduled Task\n write ${xmlPath}\n schtasks /Create /TN AgentSean /XML ${xmlPath}\n start at logon: ${tr}\n bind 127.0.0.1:${port}`,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
const unitDir = path.join(os.homedir(), ".config/systemd/user");
|
|
82
|
+
const unit = path.join(unitDir, "agentsean.service");
|
|
83
|
+
const contents = `[Unit]
|
|
84
|
+
Description=Agent Sean — the SEO engineer that never sleeps
|
|
85
|
+
After=network.target
|
|
86
|
+
|
|
87
|
+
[Service]
|
|
88
|
+
Type=simple
|
|
89
|
+
ExecStart=${shellQuote(nodePath)} ${shellQuote(entry)} --host 127.0.0.1 --port ${port} --home ${shellQuote(home)}
|
|
90
|
+
Restart=on-failure
|
|
91
|
+
RestartSec=5
|
|
92
|
+
Environment=SEAN_HOME=${home}
|
|
93
|
+
WorkingDirectory=${home}
|
|
94
|
+
|
|
95
|
+
[Install]
|
|
96
|
+
WantedBy=default.target
|
|
97
|
+
`;
|
|
98
|
+
return {
|
|
99
|
+
kind,
|
|
100
|
+
path: unit,
|
|
101
|
+
contents,
|
|
102
|
+
enable: ["systemctl", "--user", "enable", "--now", "agentsean.service"],
|
|
103
|
+
disable: ["systemctl", "--user", "disable", "--now", "agentsean.service"],
|
|
104
|
+
summary: `Linux systemd user unit\n write ${unit}\n systemctl --user enable --now agentsean.service\n bind 127.0.0.1:${port}\n SEAN_HOME=${home}`,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
export function writeService(plan) {
|
|
108
|
+
fs.mkdirSync(path.dirname(plan.path), { recursive: true, mode: 0o755 });
|
|
109
|
+
fs.writeFileSync(plan.path, plan.contents, { mode: 0o644 });
|
|
110
|
+
}
|
|
111
|
+
export function removeServiceFile(plan) {
|
|
112
|
+
if (fs.existsSync(plan.path))
|
|
113
|
+
fs.unlinkSync(plan.path);
|
|
114
|
+
}
|
|
115
|
+
function escapeXml(s) {
|
|
116
|
+
return s
|
|
117
|
+
.replaceAll("&", "&")
|
|
118
|
+
.replaceAll("<", "<")
|
|
119
|
+
.replaceAll(">", ">")
|
|
120
|
+
.replaceAll('"', """);
|
|
121
|
+
}
|
|
122
|
+
function shellQuote(s) {
|
|
123
|
+
if (/^[A-Za-z0-9_./:-]+$/.test(s))
|
|
124
|
+
return s;
|
|
125
|
+
return `'${s.replaceAll("'", `'\\''`)}'`;
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
|
package/dist/site.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type Recipe } from "./recipes.js";
|
|
2
|
+
import { VERSION } from "./version.js";
|
|
3
|
+
export declare const POSITIONING = "Every SEO tool tells you what's wrong. Agent Sean fixes it.";
|
|
4
|
+
export declare const OPENSEO_CREDIT = "OpenSEO proved an open-source SEO platform could work. Agent Sean is the execution layer that writes reversible diffs to your actual site \u2014 not a fork of OpenSEO, and not a report that stops at the finding.";
|
|
5
|
+
export declare function recipePage(recipe: Recipe): string;
|
|
6
|
+
export declare function recipesIndex(): string;
|
|
7
|
+
export declare function escapeHtml(s: string): string;
|
|
8
|
+
export { VERSION };
|
|
9
|
+
//# sourceMappingURL=site.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"site.d.ts","sourceRoot":"","sources":["../src/site.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,eAAO,MAAM,WAAW,gEACuC,CAAC;AAEhE,eAAO,MAAM,cAAc,wNACuL,CAAC;AAEnN,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA8BjD;AAED,wBAAgB,YAAY,IAAI,MAAM,CA8BrC;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAM5C;AAED,OAAO,EAAE,OAAO,EAAE,CAAC"}
|
package/dist/site.js
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { RECIPES } from "./recipes.js";
|
|
2
|
+
import { VERSION } from "./version.js";
|
|
3
|
+
export const POSITIONING = "Every SEO tool tells you what's wrong. Agent Sean fixes it.";
|
|
4
|
+
export const OPENSEO_CREDIT = "OpenSEO proved an open-source SEO platform could work. Agent Sean is the execution layer that writes reversible diffs to your actual site — not a fork of OpenSEO, and not a report that stops at the finding.";
|
|
5
|
+
export function recipePage(recipe) {
|
|
6
|
+
const steps = recipe.steps.map((s) => `<li>${escapeHtml(s)}</li>`).join("\n");
|
|
7
|
+
return `<!doctype html>
|
|
8
|
+
<html lang="en">
|
|
9
|
+
<head>
|
|
10
|
+
<meta charset="utf-8"/>
|
|
11
|
+
<title>${escapeHtml(recipe.title)} — Agent Sean</title>
|
|
12
|
+
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
|
13
|
+
<meta name="description" content="${escapeHtml(recipe.summary)}"/>
|
|
14
|
+
<link rel="stylesheet" href="../assets/style.css"/>
|
|
15
|
+
</head>
|
|
16
|
+
<body>
|
|
17
|
+
<header>
|
|
18
|
+
<a href="../index.html">Agent Sean</a>
|
|
19
|
+
<nav>
|
|
20
|
+
<a href="../install.html">Install</a>
|
|
21
|
+
<a href="index.html">Recipes</a>
|
|
22
|
+
<a href="../security.html">Security</a>
|
|
23
|
+
</nav>
|
|
24
|
+
</header>
|
|
25
|
+
<main>
|
|
26
|
+
<p class="kicker">${recipe.cms.join(" · ")}</p>
|
|
27
|
+
<h1>${escapeHtml(recipe.title)}</h1>
|
|
28
|
+
<p class="lead">${escapeHtml(recipe.summary)}</p>
|
|
29
|
+
<ol>${steps}</ol>
|
|
30
|
+
<p><a href="index.html">All recipes</a></p>
|
|
31
|
+
</main>
|
|
32
|
+
</body>
|
|
33
|
+
</html>
|
|
34
|
+
`;
|
|
35
|
+
}
|
|
36
|
+
export function recipesIndex() {
|
|
37
|
+
const items = RECIPES.map((r) => `<li id="${escapeHtml(r.id)}"><a href="${escapeHtml(r.id)}.html">${escapeHtml(r.title)}</a> — ${escapeHtml(r.summary)}</li>`).join("\n");
|
|
38
|
+
return `<!doctype html>
|
|
39
|
+
<html lang="en">
|
|
40
|
+
<head>
|
|
41
|
+
<meta charset="utf-8"/>
|
|
42
|
+
<title>SEO recipes — Agent Sean</title>
|
|
43
|
+
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
|
44
|
+
<link rel="stylesheet" href="../assets/style.css"/>
|
|
45
|
+
</head>
|
|
46
|
+
<body>
|
|
47
|
+
<header>
|
|
48
|
+
<a href="../index.html">Agent Sean</a>
|
|
49
|
+
<nav>
|
|
50
|
+
<a href="../install.html">Install</a>
|
|
51
|
+
<a href="index.html">Recipes</a>
|
|
52
|
+
<a href="../security.html">Security</a>
|
|
53
|
+
</nav>
|
|
54
|
+
</header>
|
|
55
|
+
<main>
|
|
56
|
+
<h1>Recipes</h1>
|
|
57
|
+
<p class="lead">First-party, reviewed by us. Not an open marketplace — plugins with write access to live sites do not get a public upload form.</p>
|
|
58
|
+
<ul class="recipes">${items}</ul>
|
|
59
|
+
</main>
|
|
60
|
+
</body>
|
|
61
|
+
</html>
|
|
62
|
+
`;
|
|
63
|
+
}
|
|
64
|
+
export function escapeHtml(s) {
|
|
65
|
+
return s
|
|
66
|
+
.replaceAll("&", "&")
|
|
67
|
+
.replaceAll("<", "<")
|
|
68
|
+
.replaceAll(">", ">")
|
|
69
|
+
.replaceAll('"', """);
|
|
70
|
+
}
|
|
71
|
+
export { VERSION };
|
|
72
|
+
//# sourceMappingURL=site.js.map
|
package/dist/site.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"site.js","sourceRoot":"","sources":["../src/site.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAe,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,CAAC,MAAM,WAAW,GACtB,6DAA6D,CAAC;AAEhE,MAAM,CAAC,MAAM,cAAc,GACzB,gNAAgN,CAAC;AAEnN,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9E,OAAO;;;;WAIE,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC;;sCAEG,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC;;;;;;;;;;;;;wBAaxC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;UACpC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC;sBACZ,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC;UACtC,KAAK;;;;;CAKd,CAAC;AACF,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CACvB,CAAC,CAAC,EAAE,EAAE,CACJ,WAAW,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,cAAc,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC/H,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,OAAO;;;;;;;;;;;;;;;;;;;;0BAoBiB,KAAK;;;;CAI9B,CAAC;AACF,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,CAAS;IAClC,OAAO,CAAC;SACL,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC;SACxB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;SACvB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;SACvB,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AAC/B,CAAC;AAED,OAAO,EAAE,OAAO,EAAE,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event names. The only fields we ever send are in `TelemetryPayload`.
|
|
3
|
+
* Never: domain, URL, page content, GSC query, API key, IP, hostname.
|
|
4
|
+
*/
|
|
5
|
+
export declare const TELEMETRY_EVENTS: readonly ["first_run", "command_used", "feature_used", "error_class", "cms_type", "service_installed"];
|
|
6
|
+
export type TelemetryEventName = (typeof TELEMETRY_EVENTS)[number];
|
|
7
|
+
export type TelemetryPayload = {
|
|
8
|
+
event: TelemetryEventName;
|
|
9
|
+
version: string;
|
|
10
|
+
os: string;
|
|
11
|
+
arch: string;
|
|
12
|
+
node: string;
|
|
13
|
+
installMethod: string;
|
|
14
|
+
cmsType: string | null;
|
|
15
|
+
command: string | null;
|
|
16
|
+
feature: string | null;
|
|
17
|
+
errorClass: string | null;
|
|
18
|
+
};
|
|
19
|
+
export type TelemetryConfig = {
|
|
20
|
+
enabled: boolean;
|
|
21
|
+
consentedAt: string | null;
|
|
22
|
+
installMethod: string;
|
|
23
|
+
};
|
|
24
|
+
export declare function telemetryPath(home: string): string;
|
|
25
|
+
export declare function telemetryLogPath(home: string): string;
|
|
26
|
+
export declare function dntHonored(env?: NodeJS.ProcessEnv): boolean;
|
|
27
|
+
export declare function defaultConfig(installMethod?: string): TelemetryConfig;
|
|
28
|
+
export declare function loadTelemetryConfig(home: string): TelemetryConfig;
|
|
29
|
+
export declare function saveTelemetryConfig(home: string, config: TelemetryConfig): void;
|
|
30
|
+
export declare function isTelemetryEnabled(home: string, env?: NodeJS.ProcessEnv): boolean;
|
|
31
|
+
export declare function previewPayload(partial?: Partial<TelemetryPayload>): TelemetryPayload;
|
|
32
|
+
export declare function assertSafePayload(payload: TelemetryPayload): void;
|
|
33
|
+
export declare function recordEvent(home: string, partial: Partial<TelemetryPayload> & {
|
|
34
|
+
event: TelemetryEventName;
|
|
35
|
+
}, env?: NodeJS.ProcessEnv): TelemetryPayload | null;
|
|
36
|
+
export declare function readTelemetryLog(home: string): TelemetryPayload[];
|
|
37
|
+
export declare function consentTelemetry(home: string, enabled: boolean, installMethod: string): TelemetryConfig;
|
|
38
|
+
//# sourceMappingURL=telemetry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,eAAO,MAAM,gBAAgB,wGAOnB,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,kBAAkB,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAkBF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,UAAU,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAMxE;AAED,wBAAgB,aAAa,CAAC,aAAa,SAAQ,GAAG,eAAe,CAEpE;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAajE;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI,CAK/E;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,OAAO,CAGT;AAED,wBAAgB,cAAc,CAC5B,OAAO,GAAE,OAAO,CAAC,gBAAgB,CAAM,GACtC,gBAAgB,CAelB;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAWjE;AAED,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG;IAAE,KAAK,EAAE,kBAAkB,CAAA;CAAE,EAClE,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,gBAAgB,GAAG,IAAI,CAoBzB;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAQjE;AAED,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,MAAM,GACpB,eAAe,CAQjB"}
|