@scribe-platform/cli 0.10.0 → 0.12.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.
@@ -1,3 +1,5 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
1
3
  export class ScribeApiError extends Error {
2
4
  status;
3
5
  body;
@@ -29,11 +31,98 @@ export const REQUEST_TYPES = ['content-change', 'new-page', 'bug', 'design', 'bi
29
31
  function proofPath(client, proof) {
30
32
  return `/api/v1/proofs/${encodeURIComponent(client)}/${encodeURIComponent(proof)}`;
31
33
  }
34
+ /**
35
+ * RFC 0025 — the environments a Site or a Scribe can belong to. Duplicated from
36
+ * core's `ENVIRONMENT_NAMES` rather than imported, for the same reason
37
+ * `CALL_OUTCOMES` and `REQUEST_STATUSES` are: this package talks to the admin
38
+ * over HTTP and does not depend on `@scribe-cms/core`.
39
+ */
40
+ const ENVIRONMENT_NAMES = ['production', 'development'];
41
+ /**
42
+ * The Environment the `.scribe.yml` in `cwd` says its Site belongs to, or null
43
+ * when there is no file, no key, or a value this build does not know.
44
+ *
45
+ * A regex rather than a YAML parse: this package has one dependency
46
+ * (`commander`) and adding a parser to read one top-level scalar would be the
47
+ * wrong trade. Provisioning writes the key at the top level, directly after
48
+ * `site:`, so an indented `environment:` inside a collection cannot match.
49
+ */
50
+ export function localSiteEnvironment(cwd = process.cwd()) {
51
+ try {
52
+ const text = readFileSync(join(cwd, '.scribe.yml'), 'utf-8');
53
+ const match = /^environment:[ \t]*["']?([A-Za-z-]+)["']?[ \t]*$/m.exec(text);
54
+ const value = match?.[1];
55
+ return ENVIRONMENT_NAMES.some((name) => name === value) ? value : null;
56
+ }
57
+ catch {
58
+ // No file, unreadable, not a Site repo — all the same answer: nothing local
59
+ // to compare, so say nothing rather than guess.
60
+ return null;
61
+ }
62
+ }
32
63
  export class ScribeClient {
33
64
  options;
34
65
  constructor(options) {
35
66
  this.options = options;
36
67
  }
68
+ /**
69
+ * RFC 0025 — the Environment this client is pointed at, from `/api/health`.
70
+ *
71
+ * Memoized per client instance, because the only caller is the 404 path and a
72
+ * command that 404s in a loop should not ask fifty times. `undefined` means
73
+ * "not asked yet"; `null` means asked and unanswerable, which is also the
74
+ * answer for a Scribe too old to report the field.
75
+ */
76
+ serverEnvironment;
77
+ async pointedAt() {
78
+ if (this.serverEnvironment !== undefined)
79
+ return this.serverEnvironment;
80
+ this.serverEnvironment = null;
81
+ try {
82
+ const res = await fetch(`${this.options.apiUrl}/api/health`);
83
+ const data = (await res.json());
84
+ if (ENVIRONMENT_NAMES.some((name) => name === data.environment)) {
85
+ this.serverEnvironment = data.environment;
86
+ }
87
+ }
88
+ catch {
89
+ // Unreachable or not JSON. The caller already has a real error to report;
90
+ // this only ever adds a sentence to it.
91
+ }
92
+ return this.serverEnvironment;
93
+ }
94
+ /**
95
+ * RFC 0025's client-side half of the refusal rule: turn the server's bare 404
96
+ * into the error that names the mistake.
97
+ *
98
+ * The server answers **404, not 403**, deliberately — a Site in the other
99
+ * Environment must be indistinguishable from one that does not exist
100
+ * (`packages/admin/src/lib/api-key.ts`). That is the right answer to an
101
+ * unknown caller and a useless one to Ashley, who is standing in the Site's
102
+ * own repo. So the explanation is assembled here, from the two facts only this
103
+ * side has together: the mark in the local `.scribe.yml` (PR 4 put it in every
104
+ * Site repo for exactly this) and the environment `/api/health` reports.
105
+ *
106
+ * Returns null unless both are known **and** they disagree — so an ordinary
107
+ * 404 ("no collection owns that path") is never dressed up as an environment
108
+ * problem, and a CLI run outside a Site repo says nothing extra.
109
+ *
110
+ * This lives on the client rather than in a command because the **mcp package
111
+ * imports the CLI's compiled client** (`@scribe-platform/cli/client`), so it
112
+ * inherits this for free. There is nothing separate to test or to remember
113
+ * there.
114
+ */
115
+ async environmentMismatchNote() {
116
+ const local = localSiteEnvironment();
117
+ if (!local)
118
+ return null;
119
+ const server = await this.pointedAt();
120
+ if (!server || server === local)
121
+ return null;
122
+ return (`That site belongs to ${local} and you are pointed at ${server} (${this.options.apiUrl}). ` +
123
+ 'A Site cannot move between Environments, so this is the wrong Scribe for it — check ' +
124
+ '`scribe login --api-url`, or run this from the right machine.');
125
+ }
37
126
  async send(method, path, body) {
38
127
  const res = await fetch(`${this.options.apiUrl}${path}`, {
39
128
  method,
@@ -52,10 +141,21 @@ export class ScribeClient {
52
141
  const message = data && typeof data === 'object' && 'error' in data
53
142
  ? String(data.error)
54
143
  : res.statusText;
55
- throw new ScribeApiError(message, res.status, data);
144
+ throw new ScribeApiError(await this.explain(message, res.status), res.status, data);
56
145
  }
57
146
  return data;
58
147
  }
148
+ /**
149
+ * RFC 0025 — appends the environment-mismatch sentence to a 404, when that is
150
+ * what the 404 is. Only 404s: it is the one status the refusal rule produces,
151
+ * and widening it would start explaining 401s and 409s with a guess.
152
+ */
153
+ async explain(message, status) {
154
+ if (status !== 404)
155
+ return message;
156
+ const note = await this.environmentMismatchNote();
157
+ return note ? `${message}. ${note}` : message;
158
+ }
59
159
  /**
60
160
  * For responses that aren't JSON — today, a CSV export. A failure still
61
161
  * arrives as a JSON `{ error }` body, so the error path parses while the
@@ -76,7 +176,7 @@ export class ScribeClient {
76
176
  const message = data && typeof data === 'object' && 'error' in data
77
177
  ? String(data.error)
78
178
  : res.statusText;
79
- throw new ScribeApiError(message, res.status, data);
179
+ throw new ScribeApiError(await this.explain(message, res.status), res.status, data);
80
180
  }
81
181
  return text;
82
182
  }
@@ -200,6 +300,9 @@ export class ScribeClient {
200
300
  async verifySite(site) {
201
301
  return this.request('POST', `/api/v1/sites/${encodeURIComponent(site)}/verify`);
202
302
  }
303
+ async checkSiteSeo(site) {
304
+ return this.request('POST', `/api/v1/sites/${encodeURIComponent(site)}/seo`);
305
+ }
203
306
  async buildRuns(site) {
204
307
  return this.request('GET', `/api/v1/sites/${encodeURIComponent(site)}/build/status`);
205
308
  }
@@ -314,7 +417,7 @@ export class ScribeClient {
314
417
  catch {
315
418
  // non-JSON error body; the status text will do
316
419
  }
317
- throw new ScribeApiError(message, res.status);
420
+ throw new ScribeApiError(await this.explain(message, res.status), res.status);
318
421
  }
319
422
  return new Uint8Array(await res.arrayBuffer());
320
423
  }
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/lib/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/lib/client.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,61 @@
1
+ /** One environment's bindings: where the admin is, and the key to talk to it. */
1
2
  export interface ScribeConfig {
2
3
  token: string;
3
4
  apiUrl: string;
4
5
  }
6
+ /**
7
+ * Named profiles, so one machine can address more than one Scribe.
8
+ *
9
+ * RFC 0025 made `development` a real environment with its own database and
10
+ * GitHub org, which means there are now two admin apps a person legitimately
11
+ * works against. Before this, `scribe login` wrote one `{ token, apiUrl }` and
12
+ * pointing at the dev environment *overwrote the production login* — so the way
13
+ * back was to remember a URL and a key, and the failure mode of forgetting was
14
+ * running a command against a paying Client's Scribe believing it was dev.
15
+ *
16
+ * The active profile is stored, not passed per command, which is deliberate:
17
+ * an agent session started from a GUI inherits no shell exports, so a
18
+ * `SCRIBE_PROFILE=dev` convention would silently not apply there and every
19
+ * command would quietly hit production. A stored choice applies everywhere,
20
+ * including inside Claude Code.
21
+ */
22
+ export interface ScribeProfiles {
23
+ activeProfile: string;
24
+ profiles: Record<string, ScribeConfig>;
25
+ }
26
+ /** What a migrated flat config becomes. Not "production" — the old file never said. */
27
+ export declare const DEFAULT_PROFILE = "default";
28
+ /**
29
+ * Reads the config, migrating the flat shape in memory.
30
+ *
31
+ * **In memory, not on disk.** Rewriting someone's config as a side effect of
32
+ * reading it would mean a `scribe site list` that happened to run from an older
33
+ * CLI, or a half-finished upgrade, could leave the file in a shape the other
34
+ * one cannot read. The migration lands the first time something writes.
35
+ */
36
+ export declare function loadProfiles(): ScribeProfiles | null;
37
+ /**
38
+ * The profile a command should use: `SCRIBE_PROFILE` if set, else the stored
39
+ * active one.
40
+ *
41
+ * The env override exists for a one-off — a script, a single command against
42
+ * the other environment — and deliberately does **not** change what is stored.
43
+ * Anything that wants to switch for good says so with `scribe profile use`.
44
+ */
45
+ export declare function activeProfileName(profiles: ScribeProfiles): string;
5
46
  export declare function loadConfig(): ScribeConfig | null;
47
+ /** Writes one profile and makes it active. Used by `scribe login`. */
48
+ export declare function saveProfile(name: string, config: ScribeConfig): void;
49
+ /**
50
+ * Writes the **active** profile. Kept because it is a published export of
51
+ * `@scribe-platform/cli`; removing it would be a breaking change to the package
52
+ * API for the sake of an internal rename. New code wants `saveProfile`.
53
+ */
6
54
  export declare function saveConfig(config: ScribeConfig): void;
55
+ /** Switches the active profile. Throws when it does not exist, so a typo cannot silently pick nothing. */
56
+ export declare function useProfile(name: string): void;
57
+ export declare function removeProfile(name: string): void;
7
58
  export declare function configPath(): string;
59
+ /** Last 4 characters only — enough to tell two keys apart, useless if it leaks. */
60
+ export declare function maskToken(token: string): string;
8
61
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAKD,wBAAgB,UAAU,IAAI,YAAY,GAAG,IAAI,CAOhD;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAGrD;AAED,wBAAgB,UAAU,IAAI,MAAM,CAEnC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAIA,iFAAiF;AACjF,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CACxC;AA0BD,uFAAuF;AACvF,eAAO,MAAM,eAAe,YAAY,CAAC;AAWzC;;;;;;;GAOG;AACH,wBAAgB,YAAY,IAAI,cAAc,GAAG,IAAI,CAqBpD;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CAElE;AAED,wBAAgB,UAAU,IAAI,YAAY,GAAG,IAAI,CAIhD;AAQD,sEAAsE;AACtE,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAMpE;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAGrD;AAED,0GAA0G;AAC1G,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAM7C;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAgBhD;AAED,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,mFAAmF;AACnF,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C"}
@@ -1,23 +1,131 @@
1
1
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
2
2
  import { homedir } from 'node:os';
3
3
  import { join } from 'node:path';
4
- const CONFIG_DIR = join(homedir(), '.scribe');
5
- const CONFIG_PATH = join(CONFIG_DIR, 'config.json');
6
- export function loadConfig() {
7
- if (!existsSync(CONFIG_PATH))
4
+ /**
5
+ * Where the config lives. `SCRIBE_CONFIG_DIR` overrides it.
6
+ *
7
+ * The override is not a convenience — it is the only safe way to test this
8
+ * file. Under Jest, `os.homedir()` ignores `$HOME` and returns the real one, so
9
+ * a test that "points HOME at a scratch directory" silently writes over the
10
+ * developer's actual `~/.scribe/config.json` and destroys their production
11
+ * login. That happened once, on 2026-11-05, which is why this exists and why
12
+ * `config.test.ts` refuses to run if the resolved path is the real one.
13
+ *
14
+ * Resolved per call rather than at import for the same reason: a module-level
15
+ * constant bakes in whatever the environment was when the module first loaded.
16
+ */
17
+ function configDir() {
18
+ const override = process.env.SCRIBE_CONFIG_DIR?.trim();
19
+ return override || join(homedir(), '.scribe');
20
+ }
21
+ /** What a migrated flat config becomes. Not "production" — the old file never said. */
22
+ export const DEFAULT_PROFILE = 'default';
23
+ function readRaw() {
24
+ if (!existsSync(configPath()))
8
25
  return null;
9
26
  try {
10
- return JSON.parse(readFileSync(CONFIG_PATH, 'utf-8'));
27
+ return JSON.parse(readFileSync(configPath(), 'utf-8'));
11
28
  }
12
29
  catch {
13
30
  return null;
14
31
  }
15
32
  }
33
+ /**
34
+ * Reads the config, migrating the flat shape in memory.
35
+ *
36
+ * **In memory, not on disk.** Rewriting someone's config as a side effect of
37
+ * reading it would mean a `scribe site list` that happened to run from an older
38
+ * CLI, or a half-finished upgrade, could leave the file in a shape the other
39
+ * one cannot read. The migration lands the first time something writes.
40
+ */
41
+ export function loadProfiles() {
42
+ const raw = readRaw();
43
+ if (!raw || typeof raw !== 'object')
44
+ return null;
45
+ const asProfiles = raw;
46
+ if (asProfiles.profiles && typeof asProfiles.profiles === 'object') {
47
+ return {
48
+ activeProfile: asProfiles.activeProfile ?? DEFAULT_PROFILE,
49
+ profiles: asProfiles.profiles,
50
+ };
51
+ }
52
+ const legacy = raw;
53
+ if (typeof legacy.token === 'string' && typeof legacy.apiUrl === 'string') {
54
+ return {
55
+ activeProfile: DEFAULT_PROFILE,
56
+ profiles: { [DEFAULT_PROFILE]: { token: legacy.token, apiUrl: legacy.apiUrl } },
57
+ };
58
+ }
59
+ return null;
60
+ }
61
+ /**
62
+ * The profile a command should use: `SCRIBE_PROFILE` if set, else the stored
63
+ * active one.
64
+ *
65
+ * The env override exists for a one-off — a script, a single command against
66
+ * the other environment — and deliberately does **not** change what is stored.
67
+ * Anything that wants to switch for good says so with `scribe profile use`.
68
+ */
69
+ export function activeProfileName(profiles) {
70
+ return process.env.SCRIBE_PROFILE?.trim() || profiles.activeProfile;
71
+ }
72
+ export function loadConfig() {
73
+ const profiles = loadProfiles();
74
+ if (!profiles)
75
+ return null;
76
+ return profiles.profiles[activeProfileName(profiles)] ?? null;
77
+ }
78
+ function write(profiles) {
79
+ mkdirSync(configDir(), { recursive: true });
80
+ // 0600: the file holds API keys for every environment this machine can reach.
81
+ writeFileSync(configPath(), JSON.stringify(profiles, null, 2), { mode: 0o600 });
82
+ }
83
+ /** Writes one profile and makes it active. Used by `scribe login`. */
84
+ export function saveProfile(name, config) {
85
+ const existing = loadProfiles() ?? { activeProfile: name, profiles: {} };
86
+ write({
87
+ activeProfile: name,
88
+ profiles: { ...existing.profiles, [name]: config },
89
+ });
90
+ }
91
+ /**
92
+ * Writes the **active** profile. Kept because it is a published export of
93
+ * `@scribe-platform/cli`; removing it would be a breaking change to the package
94
+ * API for the sake of an internal rename. New code wants `saveProfile`.
95
+ */
16
96
  export function saveConfig(config) {
17
- mkdirSync(CONFIG_DIR, { recursive: true });
18
- writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2), { mode: 0o600 });
97
+ const existing = loadProfiles();
98
+ saveProfile(existing ? activeProfileName(existing) : DEFAULT_PROFILE, config);
99
+ }
100
+ /** Switches the active profile. Throws when it does not exist, so a typo cannot silently pick nothing. */
101
+ export function useProfile(name) {
102
+ const existing = loadProfiles();
103
+ if (!existing || !existing.profiles[name]) {
104
+ throw new Error(`No profile "${name}". Run \`scribe profile list\` to see what there is.`);
105
+ }
106
+ write({ ...existing, activeProfile: name });
107
+ }
108
+ export function removeProfile(name) {
109
+ const existing = loadProfiles();
110
+ if (!existing || !existing.profiles[name])
111
+ throw new Error(`No profile "${name}".`);
112
+ const remaining = { ...existing.profiles };
113
+ delete remaining[name];
114
+ const names = Object.keys(remaining);
115
+ if (names.length === 0)
116
+ throw new Error(`"${name}" is the only profile — removing it would log this machine out.`);
117
+ write({
118
+ // Removing the active one has to leave *something* active, or every later
119
+ // command fails with "not logged in" on a machine that plainly is.
120
+ activeProfile: existing.activeProfile === name ? names[0] : existing.activeProfile,
121
+ profiles: remaining,
122
+ });
19
123
  }
20
124
  export function configPath() {
21
- return CONFIG_PATH;
125
+ return join(configDir(), 'config.json');
126
+ }
127
+ /** Last 4 characters only — enough to tell two keys apart, useless if it leaks. */
128
+ export function maskToken(token) {
129
+ return token.length <= 4 ? '••••' : `••••${token.slice(-4)}`;
22
130
  }
23
131
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAOjC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;AAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEpD,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAiB,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAoB;IAC7C,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,WAAW,CAAC;AACrB,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { SeoReport } from './client.js';
2
+ /**
3
+ * The judgment half of RFC 0032, printed as questions rather than results.
4
+ *
5
+ * These are the audit's *highest* priority findings and a crawler cannot decide
6
+ * one of them. They live here, in the output, rather than only in the skill,
7
+ * because the output is the thing Ashley's Claude actually reads — the skill
8
+ * tells it to ask these, and this list is what it asks. One copy, so the two
9
+ * cannot drift.
10
+ *
11
+ * Phrased as questions with no right answer on purpose. "Not yet" is a real
12
+ * answer and the point is that it gets said out loud before a Site goes live,
13
+ * not that every Site has all six.
14
+ */
15
+ export declare const JUDGMENT_QUESTIONS: readonly string[];
16
+ /** Whether anything actually failed. A skip never contributes. */
17
+ export declare function seoFailed(report: SeoReport): boolean;
18
+ export declare function printSeoReport(report: SeoReport, write?: (line: string) => void): void;
19
+ //# sourceMappingURL=seo-report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo-report.d.ts","sourceRoot":"","sources":["../../src/lib/seo-report.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAc7C;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,kBAAkB,EAAE,SAAS,MAAM,EAO/C,CAAC;AAEF,kEAAkE;AAClE,wBAAgB,SAAS,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAEpD;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAkB,GAAG,IAAI,CA6CnG"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Printing an RFC 0032 SEO check.
3
+ *
4
+ * A sibling of `verify-report.ts`, and shaped like it on purpose: the two
5
+ * commands should read the same way, because they are the same kind of answer
6
+ * about two different questions. What it does *not* share is the verdict —
7
+ * `seoFailed` is about `SeoReport.failed` alone, and nothing here can ever
8
+ * contribute to an invariant failure.
9
+ */
10
+ const MARK = { pass: '✓', fail: '✗', skip: '–' };
11
+ /**
12
+ * The judgment half of RFC 0032, printed as questions rather than results.
13
+ *
14
+ * These are the audit's *highest* priority findings and a crawler cannot decide
15
+ * one of them. They live here, in the output, rather than only in the skill,
16
+ * because the output is the thing Ashley's Claude actually reads — the skill
17
+ * tells it to ask these, and this list is what it asks. One copy, so the two
18
+ * cannot drift.
19
+ *
20
+ * Phrased as questions with no right answer on purpose. "Not yet" is a real
21
+ * answer and the point is that it gets said out loud before a Site goes live,
22
+ * not that every Site has all six.
23
+ */
24
+ export const JUDGMENT_QUESTIONS = [
25
+ 'Does the site say which town and area the business serves, on the pages a visitor lands on?',
26
+ 'Is there real client proof — a name, a review, a photo of finished work — rather than a placeholder?',
27
+ 'Is there a page for each main thing they sell, rather than one page with sections?',
28
+ 'Does the contact form sit next to a privacy policy, if it collects a name, email or phone?',
29
+ 'Would someone who has never heard of this business understand what it does from the home page alone?',
30
+ 'Is the business claimed on Google with the same name, address and phone number as the site?',
31
+ ];
32
+ /** Whether anything actually failed. A skip never contributes. */
33
+ export function seoFailed(report) {
34
+ return report.failed.length > 0;
35
+ }
36
+ export function printSeoReport(report, write = console.log) {
37
+ write(`\nChecking "${report.slug}" can be found — ${report.url}`);
38
+ if (report.pagesChecked.length === 0) {
39
+ write('\n Nothing deployed yet — no page could be fetched, so nothing was checked.');
40
+ for (const error of report.pageErrors)
41
+ write(` ${error.url} — ${error.reason}`);
42
+ }
43
+ else {
44
+ const how = report.discovery === 'sitemap' ? "from the site's own sitemap" : 'by following links from the home page';
45
+ const capped = report.truncated ? ', capped — more pages exist than were checked' : '';
46
+ write(` ${report.pagesChecked.length} page(s) checked, found ${how}${capped}\n`);
47
+ }
48
+ for (const check of report.checks) {
49
+ write(` ${MARK[check.state] ?? '?'} ${check.name.padEnd(12)} ${check.message}`);
50
+ for (const line of check.detail ?? [])
51
+ write(` ${line}`);
52
+ }
53
+ if (report.pagesChecked.length > 0 && report.pageErrors.length > 0) {
54
+ write('\n Could not be fetched (not counted either way):');
55
+ for (const error of report.pageErrors)
56
+ write(` ${error.url} — ${error.reason}`);
57
+ }
58
+ write('');
59
+ if (seoFailed(report)) {
60
+ write(` ${report.failed.length} check(s) failed: ${report.failed.join(', ')}`);
61
+ }
62
+ else if (report.pagesChecked.length === 0) {
63
+ write(' Nothing about the deployed site was checked. Deploy it, then run this again.');
64
+ }
65
+ else {
66
+ const skipped = report.skipped.length > 0 ? `, ${report.skipped.length} not applicable yet` : '';
67
+ write(` All ${report.ran} applicable check(s) passed${skipped}.`);
68
+ }
69
+ // Recorded either way — this only says that three of the checks are still
70
+ // waiting on the cutover, so a clean run here is not the same as a finished
71
+ // one.
72
+ if (!report.onOwnDomain) {
73
+ write("\n Four checks are still waiting: this site is not on the client's own domain yet.");
74
+ }
75
+ // Always printed, pass or fail. The mechanical half passing is exactly when
76
+ // somebody is most likely to call the site finished.
77
+ write('\n Ask the person you are working with, because no tool can answer these:\n');
78
+ for (const question of JUDGMENT_QUESTIONS)
79
+ write(` · ${question}`);
80
+ write('');
81
+ }
82
+ //# sourceMappingURL=seo-report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo-report.js","sourceRoot":"","sources":["../../src/lib/seo-report.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scribe-platform/cli",
3
- "version": "0.10.0",
3
+ "version": "0.12.0",
4
4
  "description": "Command-line interface for Scribe CMS \u2014 scaffold sites, edit content, and triage form submissions from the terminal",
5
5
  "license": "MIT",
6
6
  "author": "Dave Weaver",
@@ -75,6 +75,7 @@ instead of reading all of them:
75
75
  | [`recipes/collections.md`](./recipes/collections.md) | rendering editor-managed content |
76
76
  | [`recipes/forms.md`](./recipes/forms.md) | adding one or more forms |
77
77
  | [`recipes/deploy.md`](./recipes/deploy.md) | build/deploy setup or debugging |
78
+ | [`recipes/seo.md`](./recipes/seo.md) | making a site findable — sitemap, robots, canonicals, share cards, business details |
78
79
  | [`recipes/domains.md`](./recipes/domains.md) | anything about a domain — whether the client has one, getting them one, the DNS, taking a site live on it, fixing one |
79
80
  | [`recipes/requests.md`](./recipes/requests.md) | working the queue of jobs clients have asked the agency for |
80
81
  | [`recipes/prospects.md`](./recipes/prospects.md) | logging calls and follow-ups on prospects (not site-building) |
@@ -155,7 +156,7 @@ Three rules, in full, because getting them wrong is expensive:
155
156
  admin UI (sign in → account menu → **API Tokens** → New token). This is the
156
157
  whole machine setup: it writes `~/.scribe/config.json`, installs this skill,
157
158
  and turns on auto-updates. Defaults to the hosted admin at
158
- `https://scribe.weaverdigital.io`; add `--api-url <url>` only to point at a
159
+ `https://my.weaverdigital.io`; add `--api-url <url>` only to point at a
159
160
  different instance (a local dev/Docker admin). Every other command reads that
160
161
  config, no per-invocation `--token` flag. If a command fails with a raw `fetch failed`, that's not an API
161
162
  error — it means `apiUrl` in that config doesn't point at anything listening;
@@ -272,7 +273,31 @@ file that the update might have changed; if you need the new text now, read
272
273
  `scribe site verify my-site` runs the checks on their own, against whatever is
273
274
  currently live. Exits non-zero on a failure, so it works in a script.
274
275
 
275
- 8. **Domain cutover — only when a customer's own hostname is ready.** Skip this
276
+ 8. **Before going live, check the site can be found.** Only for a site that is
277
+ actually going on a client's domain — skip it for demos.
278
+
279
+ ```
280
+ scribe site seo my-site
281
+ ```
282
+ Eleven mechanical checks (RFC 0032): the sitemap, the robots file, each
283
+ page's title and description, canonicals, the card a shared link shows, the
284
+ business details search engines read, a reachable phone number, image alt
285
+ text. Each failure names [`recipes/seo.md`](./recipes/seo.md), which is how
286
+ to fix it. Three of them (`sitemap`, `canonical`, `indexable`) skip until the
287
+ site is on its domain — that is expected and not something to fix.
288
+
289
+ **Then ask her the questions the report ends with.** They are printed every
290
+ time, pass or fail, because no tool can answer them: is that testimonial a
291
+ real client, is there a page for each thing they sell, does the form need a
292
+ privacy policy, does the site name the town. Put them to her one at a time,
293
+ in her words, and fix what you can from her answers. *"Not yet"* is a real
294
+ answer — the point is that it is said out loud while it is still cheap.
295
+
296
+ **Do not promote until both halves have an answer.** `promote` refuses on a
297
+ failing check anyway, the same way it refuses when DNS is not ready. If it
298
+ does, fix the cause and run it again rather than reaching for `--force`.
299
+
300
+ 9. **Domain cutover — only when a customer's own hostname is ready.** Skip this
276
301
  entirely for demo sites; the GitHub Pages default already works.
277
302
 
278
303
  If it *isn't* ready — the client may not own a domain, may not know who holds
@@ -326,6 +351,7 @@ file that the update might have changed; if you need the new text now, read
326
351
  ## Working an existing site
327
352
 
328
353
  ```
354
+ scribe site seo <site> [--json] # can it be found? run before promote
329
355
  scribe site promote <site> --domain <domain> [--dns-only] # take it live on a real domain
330
356
  scribe site update <site> --turnstile-key <key> # correct stored settings only
331
357
 
@@ -16,6 +16,7 @@ generated config to keep in sync.
16
16
  | [`collections.md`](./collections.md) | rendering content (posts, products, events) that editors manage in Scribe |
17
17
  | [`forms.md`](./forms.md) | putting one or more forms on the Site |
18
18
  | [`deploy.md`](./deploy.md) | setting up or debugging the build and deploy |
19
+ | [`seo.md`](./seo.md) | making a site findable: sitemap, robots, canonicals, share cards, business details |
19
20
  | [`domains.md`](./domains.md) | finding out whether a client has a domain, getting them one, the DNS, taking a Site live on it, or repairing one |
20
21
  | [`requests.md`](./requests.md) | working the queue of jobs clients have asked the agency for |
21
22
  | [`prospects.md`](./prospects.md) | recording and nurturing prospects in the calling pipeline |