@scribe-platform/cli 0.2.2 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +74 -4
- package/dist/commands/schema.d.ts.map +1 -1
- package/dist/commands/schema.js +51 -0
- package/dist/commands/schema.js.map +1 -1
- package/dist/commands/submission.d.ts.map +1 -1
- package/dist/commands/submission.js +74 -22
- package/dist/commands/submission.js.map +1 -1
- package/dist/commands/update.d.ts +3 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +93 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/client.d.ts +62 -11
- package/dist/lib/client.d.ts.map +1 -1
- package/dist/lib/client.js +66 -9
- package/dist/lib/client.js.map +1 -1
- package/dist/lib/skill.d.ts +45 -0
- package/dist/lib/skill.d.ts.map +1 -0
- package/dist/lib/skill.js +70 -0
- package/dist/lib/skill.js.map +1 -0
- package/package.json +3 -1
- package/skills/scribe-site-builder/SKILL.md +373 -0
- package/skills/scribe-site-builder/recipes/README.md +31 -0
- package/skills/scribe-site-builder/recipes/collections.md +87 -0
- package/skills/scribe-site-builder/recipes/deploy.md +122 -0
- package/skills/scribe-site-builder/recipes/forms.md +231 -0
- package/skills/scribe-site-builder/recipes/schema.md +99 -0
package/README.md
CHANGED
|
@@ -32,6 +32,21 @@ It defaults to the hosted admin at `https://scribe.weaverdigital.io` — pass
|
|
|
32
32
|
scribe login --token <key> --api-url http://localhost:3000
|
|
33
33
|
```
|
|
34
34
|
|
|
35
|
+
## Update
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
scribe update
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Installs the latest `@scribe-platform/cli` and copies the bundled
|
|
42
|
+
`scribe-site-builder` Claude Code skill into `~/.claude/skills/`, so the CLI and
|
|
43
|
+
the instructions Claude reads move together. Restart Claude Code afterwards — it
|
|
44
|
+
only discovers skills at session start.
|
|
45
|
+
|
|
46
|
+
Requires a global npm install; it refuses to guess for a checkout, `npx`, or
|
|
47
|
+
another package manager. A symlinked `~/.claude/skills/scribe-site-builder` is
|
|
48
|
+
left untouched, so a dev checkout's live skill isn't replaced by a copy.
|
|
49
|
+
|
|
35
50
|
## Commands
|
|
36
51
|
|
|
37
52
|
Run `scribe <group> --help` for the full options on any of these.
|
|
@@ -72,20 +87,75 @@ that path.
|
|
|
72
87
|
### Schema
|
|
73
88
|
|
|
74
89
|
```
|
|
90
|
+
scribe schema show <site> [collection-name] [--json]
|
|
91
|
+
scribe schema apply <site> --file <spec|->
|
|
75
92
|
scribe schema add <site> <collection-name> [--path <path>]
|
|
76
93
|
scribe schema remove <site> <collection-name>
|
|
77
94
|
```
|
|
78
95
|
|
|
79
|
-
`schema
|
|
80
|
-
|
|
96
|
+
`schema show` prints the site's collections and their fields; `--json` gives the
|
|
97
|
+
raw schema, for piping into another tool.
|
|
98
|
+
|
|
99
|
+
`schema apply` creates or replaces **one whole collection** from a YAML or JSON
|
|
100
|
+
spec, matched by `name`. It validates before committing anything, so a reserved
|
|
101
|
+
field name, an `image` field on a form collection, or a malformed workflow comes
|
|
102
|
+
back as an error rather than a broken site. Pass `--file -` to read from a pipe.
|
|
103
|
+
|
|
104
|
+
```yaml
|
|
105
|
+
# rsvps.yml — then: scribe schema apply my-site --file rsvps.yml
|
|
106
|
+
name: rsvps
|
|
107
|
+
label: Event RSVPs
|
|
108
|
+
path: content/rsvps
|
|
109
|
+
format: yaml
|
|
110
|
+
form: true
|
|
111
|
+
fields:
|
|
112
|
+
- { name: fullName, type: string, required: true }
|
|
113
|
+
- { name: email, type: string, required: true }
|
|
114
|
+
- { name: guests, type: number }
|
|
115
|
+
- { name: attending, type: boolean, label: I'll be there }
|
|
116
|
+
workflow:
|
|
117
|
+
states:
|
|
118
|
+
- { name: pending, label: Awaiting reply, kind: needs-you }
|
|
119
|
+
- { name: confirmed, label: Confirmed, kind: closed }
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
A site can have as many `form: true` collections as it likes; each gets its own
|
|
123
|
+
inbox and workflow. `schema apply` replaces the collection wholesale, so include
|
|
124
|
+
every field you want to keep.
|
|
125
|
+
|
|
126
|
+
`schema add` appends a bare collection stub with no fields — use it to start a
|
|
127
|
+
content collection interactively. For anything with fields, prefer
|
|
128
|
+
`schema apply`.
|
|
81
129
|
|
|
82
130
|
### Form submissions
|
|
83
131
|
|
|
84
132
|
```
|
|
85
|
-
scribe submission list <site> <collection> [--status <status>] [--json]
|
|
86
|
-
scribe submission update <site> <collection> <id> [--status <status>] [--
|
|
133
|
+
scribe submission list <site> <collection> [--status <status>] [--page <n>] [--json]
|
|
134
|
+
scribe submission update <site> <collection> <id> [--status <status>] [--note <note>]
|
|
135
|
+
scribe submission export <site> <collection> [--format csv|json] [--status <status>] [--out <file>]
|
|
136
|
+
scribe submission delete <site> <collection> <id> [--yes]
|
|
87
137
|
```
|
|
88
138
|
|
|
139
|
+
`<id>` is the submission's id as printed by `submission list`. `--note` appends to
|
|
140
|
+
the submission's history; notes are an append-only log, so nothing overwrites an
|
|
141
|
+
earlier one.
|
|
142
|
+
|
|
143
|
+
`export` writes to stdout unless `--out` is given, so it pipes:
|
|
144
|
+
|
|
145
|
+
```
|
|
146
|
+
scribe submission export daves-exotic-cars inquiries > leads.csv
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
CSV is for a spreadsheet and is lossy on purpose — its columns come from the
|
|
150
|
+
collection's schema (so the header row is identical between exports, even when a
|
|
151
|
+
batch left a field blank), and it carries no history and no visitor IP or user
|
|
152
|
+
agent. `--format json` is the lossless one: every field, with each submission's
|
|
153
|
+
events nested under it.
|
|
154
|
+
|
|
155
|
+
`delete` is permanent and cascades the submission's history. It needs a staff
|
|
156
|
+
role — a site user's API key gets a 403 — and it prompts for the id unless you
|
|
157
|
+
pass `--yes`. There is no equivalent in the admin UI, on purpose.
|
|
158
|
+
|
|
89
159
|
### Builds
|
|
90
160
|
|
|
91
161
|
```
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/commands/schema.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/commands/schema.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmF7D"}
|
package/dist/commands/schema.js
CHANGED
|
@@ -1,4 +1,12 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
1
2
|
import { requireClient, runAction } from '../lib/cli-utils.js';
|
|
3
|
+
/** `--file -` reads the spec from a pipe, which is how an agent hands one over without a temp file. */
|
|
4
|
+
async function readStdin() {
|
|
5
|
+
const chunks = [];
|
|
6
|
+
for await (const chunk of process.stdin)
|
|
7
|
+
chunks.push(chunk);
|
|
8
|
+
return Buffer.concat(chunks).toString('utf-8');
|
|
9
|
+
}
|
|
2
10
|
export function registerSchemaCommands(program) {
|
|
3
11
|
const schema = program.command('schema').description('Manage a site\'s .scribe.yml collections');
|
|
4
12
|
schema
|
|
@@ -12,6 +20,49 @@ export function registerSchemaCommands(program) {
|
|
|
12
20
|
await client.schemaAdd(site, name, opts.path);
|
|
13
21
|
console.log(`Added collection "${name}" to ${site}'s .scribe.yml`);
|
|
14
22
|
}));
|
|
23
|
+
schema
|
|
24
|
+
.command('show')
|
|
25
|
+
.description("Print a site's collections, or one collection's full definition")
|
|
26
|
+
.argument('<site>', 'Site slug')
|
|
27
|
+
.argument('[collection-name]', 'Limit to one collection')
|
|
28
|
+
.option('--json', 'Print raw JSON, for piping into another tool')
|
|
29
|
+
.action(runAction(async (site, name, opts) => {
|
|
30
|
+
const client = requireClient();
|
|
31
|
+
const schema = await client.getSchema(site);
|
|
32
|
+
const collections = name ? schema.collections.filter((c) => c.name === name) : schema.collections;
|
|
33
|
+
if (name && collections.length === 0) {
|
|
34
|
+
throw new Error(`No collection "${name}" in ${site}'s .scribe.yml`);
|
|
35
|
+
}
|
|
36
|
+
if (opts.json) {
|
|
37
|
+
console.log(JSON.stringify(name ? collections[0] : schema, null, 2));
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
for (const collection of collections) {
|
|
41
|
+
const kind = collection.form === true ? 'form' : 'content';
|
|
42
|
+
console.log(`${collection.name} (${kind})${collection.label ? ` — ${collection.label}` : ''}`);
|
|
43
|
+
for (const field of collection.fields ?? []) {
|
|
44
|
+
const flags = [field.required ? 'required' : null, field.hidden ? 'hidden' : null]
|
|
45
|
+
.filter(Boolean)
|
|
46
|
+
.join(', ');
|
|
47
|
+
console.log(` ${field.name}: ${field.type}${flags ? ` (${flags})` : ''}`);
|
|
48
|
+
}
|
|
49
|
+
const states = collection.workflow?.states ?? [];
|
|
50
|
+
if (states.length > 0) {
|
|
51
|
+
console.log(` workflow: ${states.map((s) => s.name).join(' → ')}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}));
|
|
55
|
+
schema
|
|
56
|
+
.command('apply')
|
|
57
|
+
.description('Create or replace one whole collection from a YAML/JSON spec file')
|
|
58
|
+
.argument('<site>', 'Site slug')
|
|
59
|
+
.requiredOption('-f, --file <path>', 'Spec file describing one collection, or - for stdin')
|
|
60
|
+
.action(runAction(async (site, opts) => {
|
|
61
|
+
const spec = opts.file === '-' ? await readStdin() : await readFile(opts.file, 'utf-8');
|
|
62
|
+
const client = requireClient();
|
|
63
|
+
const result = await client.schemaApply(site, spec);
|
|
64
|
+
console.log(`${result.replaced ? 'Replaced' : 'Added'} collection "${result.collection}" in ${site}'s .scribe.yml`);
|
|
65
|
+
}));
|
|
15
66
|
schema
|
|
16
67
|
.command('remove')
|
|
17
68
|
.description('Remove a collection from .scribe.yml and delete its folder')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/commands/schema.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/commands/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"submission.d.ts","sourceRoot":"","sources":["../../src/commands/submission.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"submission.d.ts","sourceRoot":"","sources":["../../src/commands/submission.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuHjE"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { writeFile } from 'node:fs/promises';
|
|
2
|
+
import { createInterface } from 'node:readline/promises';
|
|
1
3
|
import { printResult, requireClient, runAction } from '../lib/cli-utils.js';
|
|
2
4
|
export function registerSubmissionCommands(program) {
|
|
3
5
|
const submission = program.command('submission').description('Manage form submissions');
|
|
@@ -7,46 +9,96 @@ export function registerSubmissionCommands(program) {
|
|
|
7
9
|
.argument('<site>', 'Site slug')
|
|
8
10
|
.argument('<collection>', 'Form collection name')
|
|
9
11
|
.option('--status <status>', 'Filter by workflow status')
|
|
12
|
+
.option('--page <n>', 'Page of results, 1-based')
|
|
10
13
|
.option('--json', 'Output as JSON')
|
|
11
14
|
.action(runAction(async (site, collection, opts) => {
|
|
15
|
+
let page;
|
|
16
|
+
if (opts.page !== undefined) {
|
|
17
|
+
page = Number(opts.page);
|
|
18
|
+
if (!Number.isInteger(page) || page < 1) {
|
|
19
|
+
console.error('--page must be a positive integer');
|
|
20
|
+
process.exitCode = 1;
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
12
24
|
const client = requireClient();
|
|
13
|
-
const
|
|
14
|
-
|
|
25
|
+
const result = await client.listSubmissions(site, collection, opts.status, page);
|
|
26
|
+
// `--json` emits the whole page object, so a script can see `total` and
|
|
27
|
+
// page through the rest; the table shows the rows plus one footer line,
|
|
28
|
+
// because a table alone can't tell you there's a page 2.
|
|
29
|
+
if (opts.json) {
|
|
30
|
+
printResult(result, true);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
printResult(result.items, false);
|
|
34
|
+
console.log(`Page ${result.page} — ${result.items.length} of ${result.total}`);
|
|
35
|
+
}));
|
|
36
|
+
submission
|
|
37
|
+
.command('export')
|
|
38
|
+
.description('Export a form collection\u2019s submissions as CSV or JSON')
|
|
39
|
+
.argument('<site>', 'Site slug')
|
|
40
|
+
.argument('<collection>', 'Form collection name')
|
|
41
|
+
.option('--format <format>', 'csv or json', 'csv')
|
|
42
|
+
.option('--status <status>', 'Filter by workflow status')
|
|
43
|
+
.option('--out <file>', 'Write to a file instead of stdout')
|
|
44
|
+
.action(runAction(async (site, collection, opts) => {
|
|
45
|
+
if (opts.format !== 'csv' && opts.format !== 'json') {
|
|
46
|
+
console.error('--format must be csv or json');
|
|
47
|
+
process.exitCode = 1;
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const client = requireClient();
|
|
51
|
+
const body = await client.exportSubmissions(site, collection, opts.format, opts.status);
|
|
52
|
+
if (opts.out) {
|
|
53
|
+
await writeFile(opts.out, body, 'utf8');
|
|
54
|
+
console.log(`Wrote ${opts.out}`);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
// Straight to stdout with no trailing newline of our own — the CSV
|
|
58
|
+
// already ends in CRLF, and `scribe ... > leads.csv` has to produce the
|
|
59
|
+
// same bytes as `--out leads.csv`.
|
|
60
|
+
process.stdout.write(body);
|
|
15
61
|
}));
|
|
16
62
|
submission
|
|
17
63
|
.command('update')
|
|
18
|
-
.description(
|
|
64
|
+
.description("Update a submission's workflow status and/or add a note")
|
|
19
65
|
.argument('<site>', 'Site slug')
|
|
20
66
|
.argument('<collection>', 'Form collection name')
|
|
21
|
-
.argument('<id>', 'Submission
|
|
67
|
+
.argument('<id>', 'Submission id')
|
|
22
68
|
.option('--status <status>', 'New workflow status')
|
|
23
|
-
.option('--
|
|
69
|
+
.option('--note <note>', 'Add a note')
|
|
24
70
|
.action(runAction(async (site, collection, id, opts) => {
|
|
25
|
-
if (!opts.status && opts.
|
|
26
|
-
console.error('Provide --status and/or --
|
|
71
|
+
if (!opts.status && opts.note === undefined) {
|
|
72
|
+
console.error('Provide --status and/or --note');
|
|
27
73
|
process.exitCode = 1;
|
|
28
74
|
return;
|
|
29
75
|
}
|
|
30
76
|
const client = requireClient();
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
77
|
+
await client.updateSubmission(site, collection, id, { status: opts.status, note: opts.note });
|
|
78
|
+
const changes = [opts.status ? `status ${opts.status}` : null, opts.note !== undefined ? 'note added' : null].filter(Boolean);
|
|
79
|
+
console.log(`Updated ${id} (${changes.join(', ')})`);
|
|
80
|
+
}));
|
|
81
|
+
submission
|
|
82
|
+
.command('delete')
|
|
83
|
+
.description('Permanently delete a submission and its history. Staff only. Cannot be undone.')
|
|
84
|
+
.argument('<site>', 'Site slug')
|
|
85
|
+
.argument('<collection>', 'Form collection name')
|
|
86
|
+
.argument('<id>', 'Submission id')
|
|
87
|
+
.option('--yes', 'Skip the interactive confirmation prompt')
|
|
88
|
+
.action(runAction(async (site, collection, id, opts) => {
|
|
89
|
+
if (!opts.yes) {
|
|
90
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
91
|
+
const answer = await rl.question(`This permanently deletes submission ${id} and its entire history. Type the id to confirm: `);
|
|
92
|
+
rl.close();
|
|
93
|
+
if (answer.trim() !== id) {
|
|
94
|
+
console.error('Confirmation did not match — aborted.');
|
|
37
95
|
process.exitCode = 1;
|
|
38
96
|
return;
|
|
39
97
|
}
|
|
40
|
-
path = `${collectionSchema.path}/${id}`;
|
|
41
|
-
}
|
|
42
|
-
const current = await client.readContent(site, path).catch(() => null);
|
|
43
|
-
if (!current) {
|
|
44
|
-
console.error(`Submission not found: ${path}`);
|
|
45
|
-
process.exitCode = 1;
|
|
46
|
-
return;
|
|
47
98
|
}
|
|
48
|
-
const
|
|
49
|
-
|
|
99
|
+
const client = requireClient();
|
|
100
|
+
await client.deleteSubmission(site, collection, id);
|
|
101
|
+
console.log(`Deleted ${id}.`);
|
|
50
102
|
}));
|
|
51
103
|
}
|
|
52
104
|
//# sourceMappingURL=submission.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"submission.js","sourceRoot":"","sources":["../../src/commands/submission.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"submission.js","sourceRoot":"","sources":["../../src/commands/submission.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgDpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoD5D"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { spawnSync } from 'node:child_process';
|
|
2
|
+
import { readFileSync, realpathSync } from 'node:fs';
|
|
3
|
+
import { dirname, join, resolve, sep } from 'node:path';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { CliExit, runAction } from '../lib/cli-utils.js';
|
|
6
|
+
import { installSkill, tildify } from '../lib/skill.js';
|
|
7
|
+
const PACKAGE_NAME = '@scribe-platform/cli';
|
|
8
|
+
/** This install's own package root — `<global npm root>/@scribe-platform/cli` when installed globally. */
|
|
9
|
+
function packageRoot() {
|
|
10
|
+
return resolve(dirname(fileURLToPath(import.meta.url)), '..', '..');
|
|
11
|
+
}
|
|
12
|
+
/** The version recorded on disk right now, which is the new one once `npm install -g` has run. */
|
|
13
|
+
function installedVersion(root) {
|
|
14
|
+
try {
|
|
15
|
+
const pkg = JSON.parse(readFileSync(join(root, 'package.json'), 'utf-8'));
|
|
16
|
+
return pkg.version ?? null;
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function npm(args, inherit) {
|
|
23
|
+
return spawnSync('npm', args, {
|
|
24
|
+
stdio: inherit ? 'inherit' : 'pipe',
|
|
25
|
+
encoding: 'utf-8',
|
|
26
|
+
// npm is a shell script/.cmd on Windows, so it isn't directly executable there.
|
|
27
|
+
shell: process.platform === 'win32',
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
/** True when `root` sits inside npm's global package directory — i.e. `npm install -g` owns this install. */
|
|
31
|
+
function isGlobalInstall(root) {
|
|
32
|
+
const result = npm(['root', '-g'], false);
|
|
33
|
+
if (result.status !== 0 || typeof result.stdout !== 'string')
|
|
34
|
+
return false;
|
|
35
|
+
// Both sides get realpath'd: nvm, Homebrew and Volta all hand out globals
|
|
36
|
+
// through symlinked prefixes, so a raw string compare gives false negatives.
|
|
37
|
+
const real = (path) => {
|
|
38
|
+
try {
|
|
39
|
+
return realpathSync(path);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return path;
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
const globalRoot = real(result.stdout.trim());
|
|
46
|
+
return real(root).startsWith(globalRoot + sep);
|
|
47
|
+
}
|
|
48
|
+
export function registerUpdateCommand(program) {
|
|
49
|
+
program
|
|
50
|
+
.command('update')
|
|
51
|
+
// Aliased because `scribe site update` already exists: someone reaching for
|
|
52
|
+
// "upgrade the tool" shouldn't hit a dead end over which word we chose.
|
|
53
|
+
.alias('upgrade')
|
|
54
|
+
.description('Update the scribe CLI and the Claude Code skill that ships with it')
|
|
55
|
+
.action(runAction(async () => {
|
|
56
|
+
const root = packageRoot();
|
|
57
|
+
if (!isGlobalInstall(root)) {
|
|
58
|
+
console.error(`This scribe isn't a global npm install — it's running from ${root}.`);
|
|
59
|
+
console.error('Update it the way it was installed. For a normal install that is:');
|
|
60
|
+
console.error(` npm install -g ${PACKAGE_NAME}@latest`);
|
|
61
|
+
process.exitCode = 1;
|
|
62
|
+
throw new CliExit();
|
|
63
|
+
}
|
|
64
|
+
const before = installedVersion(root);
|
|
65
|
+
console.log(`Updating ${PACKAGE_NAME}${before ? ` (currently ${before})` : ''}...`);
|
|
66
|
+
const install = npm(['install', '-g', `${PACKAGE_NAME}@latest`], true);
|
|
67
|
+
if (install.status !== 0) {
|
|
68
|
+
console.error(`\nnpm install -g ${PACKAGE_NAME}@latest failed.`);
|
|
69
|
+
console.error("If that was a permission error (EACCES), fix npm's global prefix or re-run it with sudo.");
|
|
70
|
+
process.exitCode = 1;
|
|
71
|
+
throw new CliExit();
|
|
72
|
+
}
|
|
73
|
+
// npm has replaced this package's files in place. The code already
|
|
74
|
+
// running is the old version, but everything below reads from disk, so
|
|
75
|
+
// the skill installed is the one that ships with the new version.
|
|
76
|
+
const after = installedVersion(root);
|
|
77
|
+
console.log(after && after !== before ? `\nUpdated to ${after}.` : `\nAlready on the latest version${after ? ` (${after})` : ''}.`);
|
|
78
|
+
const skill = installSkill();
|
|
79
|
+
if (skill.status === 'missing-source') {
|
|
80
|
+
console.error("The CLI updated, but its bundled skill wasn't where this version expected it.");
|
|
81
|
+
console.error('Run `scribe update` once more — the newer code knows where to look.');
|
|
82
|
+
process.exitCode = 1;
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
if (skill.status === 'symlink') {
|
|
86
|
+
console.log(`Skill: left ${tildify(skill.dest)} alone — it's a symlink into a checkout.`);
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
console.log(`Skill: installed scribe-site-builder to ${tildify(skill.dest)}.`);
|
|
90
|
+
console.log('\nRestart Claude Code so it picks up the updated skill.');
|
|
91
|
+
}));
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBpC,wBAAgB,aAAa,IAAI,OAAO,CAgBvC;AAED,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -6,6 +6,7 @@ import { registerContentCommands } from './commands/content.js';
|
|
|
6
6
|
import { registerSubmissionCommands } from './commands/submission.js';
|
|
7
7
|
import { registerSchemaCommands } from './commands/schema.js';
|
|
8
8
|
import { registerBuildCommands } from './commands/build.js';
|
|
9
|
+
import { registerUpdateCommand } from './commands/update.js';
|
|
9
10
|
// Read from package.json at runtime rather than hardcoding: `../package.json`
|
|
10
11
|
// resolves to the package root from both `dist/index.js` (published) and
|
|
11
12
|
// `src/index.ts` (tests), so `scribe --version` can't drift from the release.
|
|
@@ -22,6 +23,7 @@ export function createProgram() {
|
|
|
22
23
|
registerSubmissionCommands(program);
|
|
23
24
|
registerSchemaCommands(program);
|
|
24
25
|
registerBuildCommands(program);
|
|
26
|
+
registerUpdateCommand(program);
|
|
25
27
|
return program;
|
|
26
28
|
}
|
|
27
29
|
export { ScribeClient, ScribeApiError } from './lib/client.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,8EAA8E;AAC9E,yEAAyE;AACzE,8EAA8E;AAC9E,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAC5B,YAAY,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAC5C,CAAC;AAEzB,MAAM,UAAU,aAAa;IAC3B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAC9B,OAAO;SACJ,IAAI,CAAC,QAAQ,CAAC;SACd,WAAW,CAAC,uCAAuC,CAAC;SACpD,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpB,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC9B,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC9B,uBAAuB,CAAC,OAAO,CAAC,CAAC;IACjC,0BAA0B,CAAC,OAAO,CAAC,CAAC;IACpC,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAChC,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAE/B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC"}
|
package/dist/lib/client.d.ts
CHANGED
|
@@ -56,16 +56,41 @@ export interface CommitInfo {
|
|
|
56
56
|
date: string;
|
|
57
57
|
author: string;
|
|
58
58
|
}
|
|
59
|
+
/** A submission as the API returns it — `id` is an ObjectId, dates are ISO-8601 strings. */
|
|
59
60
|
export interface SubmissionItem {
|
|
60
|
-
|
|
61
|
-
|
|
61
|
+
id: string;
|
|
62
|
+
collection: string;
|
|
63
|
+
status: string;
|
|
62
64
|
fields: Record<string, unknown>;
|
|
63
|
-
submittedAt:
|
|
65
|
+
submittedAt: string;
|
|
66
|
+
updatedAt: string;
|
|
67
|
+
}
|
|
68
|
+
/** One page of submissions. `total` counts everything matching the filter, not `items.length`. */
|
|
69
|
+
export interface SubmissionPage {
|
|
70
|
+
items: SubmissionItem[];
|
|
71
|
+
total: number;
|
|
72
|
+
page: number;
|
|
73
|
+
pageSize: number;
|
|
74
|
+
}
|
|
75
|
+
export interface SchemaField {
|
|
76
|
+
name: string;
|
|
77
|
+
type: string;
|
|
78
|
+
label?: string;
|
|
79
|
+
required?: boolean;
|
|
80
|
+
hidden?: boolean;
|
|
64
81
|
}
|
|
65
82
|
export interface SchemaCollection {
|
|
66
83
|
name: string;
|
|
67
84
|
path: string;
|
|
68
85
|
form?: boolean;
|
|
86
|
+
label?: string;
|
|
87
|
+
/** Typed only as far as `schema show` prints it; the admin owns the full shape. */
|
|
88
|
+
fields?: SchemaField[];
|
|
89
|
+
workflow?: {
|
|
90
|
+
states?: Array<{
|
|
91
|
+
name: string;
|
|
92
|
+
}>;
|
|
93
|
+
};
|
|
69
94
|
[key: string]: unknown;
|
|
70
95
|
}
|
|
71
96
|
export interface ScribeSchema {
|
|
@@ -80,7 +105,14 @@ export interface ScribeSchema {
|
|
|
80
105
|
export declare class ScribeClient {
|
|
81
106
|
private readonly options;
|
|
82
107
|
constructor(options: ScribeClientOptions);
|
|
108
|
+
private send;
|
|
83
109
|
private request;
|
|
110
|
+
/**
|
|
111
|
+
* For responses that aren't JSON — today, a CSV export. A failure still
|
|
112
|
+
* arrives as a JSON `{ error }` body, so the error path parses while the
|
|
113
|
+
* success path deliberately doesn't.
|
|
114
|
+
*/
|
|
115
|
+
private requestText;
|
|
84
116
|
whoami(): Promise<{
|
|
85
117
|
scope: 'read' | 'read-write';
|
|
86
118
|
siteSlugs: string[];
|
|
@@ -137,21 +169,40 @@ export declare class ScribeClient {
|
|
|
137
169
|
path: string;
|
|
138
170
|
sha: string;
|
|
139
171
|
}>;
|
|
140
|
-
|
|
141
|
-
|
|
172
|
+
/** `page` is 1-based; omitting it lets the server pick the first page and its own page size. */
|
|
173
|
+
listSubmissions(site: string, collection: string, status?: string, page?: number): Promise<SubmissionPage>;
|
|
174
|
+
/**
|
|
175
|
+
* `id` is the submission's ObjectId, so the route takes a single path segment
|
|
176
|
+
* rather than a repo path. No `sha` and no conflict case: status is
|
|
177
|
+
* last-write-wins, and `note` appends to the event log — which is the record
|
|
178
|
+
* of what actually happened.
|
|
179
|
+
*/
|
|
180
|
+
updateSubmission(site: string, collection: string, id: string, input: {
|
|
142
181
|
status?: string;
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
182
|
+
note?: string;
|
|
183
|
+
}): Promise<SubmissionItem>;
|
|
184
|
+
/** Hard delete, cascading the submission's events. Staff roles only — a site user's key gets a 403. */
|
|
185
|
+
deleteSubmission(site: string, collection: string, id: string): Promise<{
|
|
186
|
+
ok: true;
|
|
187
|
+
id: string;
|
|
149
188
|
}>;
|
|
189
|
+
/**
|
|
190
|
+
* Returns the export as **text**, not a parsed object, so a CSV reaches
|
|
191
|
+
* stdout byte-for-byte as the server wrote it and a JSON export isn't
|
|
192
|
+
* round-tripped through `JSON.parse` only to be stringified again with
|
|
193
|
+
* different spacing.
|
|
194
|
+
*/
|
|
195
|
+
exportSubmissions(site: string, collection: string, format: 'csv' | 'json', status?: string): Promise<string>;
|
|
150
196
|
getSchema(site: string): Promise<ScribeSchema>;
|
|
151
197
|
schemaAdd(site: string, name: string, path?: string): Promise<{
|
|
152
198
|
ok: true;
|
|
153
199
|
collection: string;
|
|
154
200
|
}>;
|
|
201
|
+
schemaApply(site: string, spec: string): Promise<{
|
|
202
|
+
ok: true;
|
|
203
|
+
collection: string;
|
|
204
|
+
replaced: boolean;
|
|
205
|
+
}>;
|
|
155
206
|
schemaRemove(site: string, name: string): Promise<{
|
|
156
207
|
ok: true;
|
|
157
208
|
deletedFiles: number;
|
package/dist/lib/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/lib/client.ts"],"names":[],"mappings":"AAAA,qBAAa,cAAe,SAAQ,KAAK;aAGrB,MAAM,EAAE,MAAM;aACd,IAAI,CAAC,EAAE,OAAO;gBAF9B,OAAO,EAAE,MAAM,EACC,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,OAAO,YAAA;CAKjC;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,IAAI,GAAG,YAAY,GAAG,oBAAoB,GAAG,cAAc,CAAC;IACpE,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE;QAAE,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CAC5C;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,IAAI,CAAC;IACT,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,GAAG,CAAC,EAAE,aAAa,CAAC;IACpB,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/lib/client.ts"],"names":[],"mappings":"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"}
|