@extenshi/cli 0.27.0 → 0.28.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/dist/cli.d.ts +1 -1
- package/dist/cli.js +9 -43
- package/dist/cli.js.map +1 -1
- package/dist/command-lifecycle.d.ts +8 -0
- package/dist/command-lifecycle.d.ts.map +1 -0
- package/dist/command-lifecycle.js +48 -0
- package/dist/command-lifecycle.js.map +1 -0
- package/dist/localize-init.d.ts.map +1 -1
- package/dist/localize-init.js +5 -0
- package/dist/localize-init.js.map +1 -1
- package/dist/pay-test-cycle.d.ts +2 -1
- package/dist/pay-test-cycle.d.ts.map +1 -1
- package/dist/pay-test-cycle.js +3 -3
- package/dist/pay-test-cycle.js.map +1 -1
- package/dist/pay.d.ts +2 -1
- package/dist/pay.d.ts.map +1 -1
- package/dist/pay.js +3 -3
- package/dist/pay.js.map +1 -1
- package/dist/png.d.ts.map +1 -1
- package/dist/png.js +14 -3
- package/dist/png.js.map +1 -1
- package/dist/project.d.ts +2 -1
- package/dist/project.d.ts.map +1 -1
- package/dist/project.js +22 -20
- package/dist/project.js.map +1 -1
- package/dist/review-checks.d.ts.map +1 -1
- package/dist/review-checks.js +5 -1
- package/dist/review-checks.js.map +1 -1
- package/dist/smoke.d.ts.map +1 -1
- package/dist/smoke.js +8 -2
- package/dist/smoke.js.map +1 -1
- package/dist/telemetry.d.ts +3 -1
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +7 -2
- package/dist/telemetry.js.map +1 -1
- package/dist/uninstall.d.ts +48 -0
- package/dist/uninstall.d.ts.map +1 -0
- package/dist/uninstall.js +194 -0
- package/dist/uninstall.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `extenshi uninstall …` — the hosted uninstall survey from the terminal, and
|
|
3
|
+
* `extenshi brand-mentions` to find an old name across every hosted page.
|
|
4
|
+
* Same BFF procedures as the MCP tools (uninstallFeedback.agent*,
|
|
5
|
+
* devProject.agentFindBrandMentions); plan 2026-10-18 §3.4.
|
|
6
|
+
*/
|
|
7
|
+
import { randomUUID } from 'node:crypto';
|
|
8
|
+
import { readFile } from 'node:fs/promises';
|
|
9
|
+
import { z } from 'zod';
|
|
10
|
+
import { loadConfig } from './config.js';
|
|
11
|
+
import { InvalidInputError } from './expected-error.js';
|
|
12
|
+
import { projectRequest } from './project.js';
|
|
13
|
+
const uuid = z.string().uuid();
|
|
14
|
+
function id(value, flag) {
|
|
15
|
+
const parsed = uuid.safeParse(value);
|
|
16
|
+
if (!parsed.success)
|
|
17
|
+
throw new InvalidInputError(`${flag} must be a UUID`);
|
|
18
|
+
return parsed.data;
|
|
19
|
+
}
|
|
20
|
+
async function jsonFile(file, what) {
|
|
21
|
+
let text;
|
|
22
|
+
try {
|
|
23
|
+
text = await readFile(file, 'utf8');
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
throw new InvalidInputError(`Cannot read ${what} file ${file}`);
|
|
27
|
+
}
|
|
28
|
+
try {
|
|
29
|
+
const value = JSON.parse(text);
|
|
30
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
31
|
+
throw new InvalidInputError(`${what} must be a JSON object`);
|
|
32
|
+
return value;
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
if (err instanceof InvalidInputError)
|
|
36
|
+
throw err;
|
|
37
|
+
throw new InvalidInputError(`${file} is not valid JSON`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function print(value) {
|
|
41
|
+
console.log(JSON.stringify(value, null, 2));
|
|
42
|
+
}
|
|
43
|
+
export async function runUninstallList(opts) {
|
|
44
|
+
const result = await projectRequest(await loadConfig(), 'uninstallFeedback.agentListForms', {
|
|
45
|
+
projectId: id(opts.project, '--project'),
|
|
46
|
+
});
|
|
47
|
+
print(result);
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
export async function runUninstallGet(opts) {
|
|
51
|
+
const result = await projectRequest(await loadConfig(), 'uninstallFeedback.agentGetForm', {
|
|
52
|
+
projectId: id(opts.project, '--project'),
|
|
53
|
+
formId: id(opts.form, '--form'),
|
|
54
|
+
});
|
|
55
|
+
print(result);
|
|
56
|
+
return result;
|
|
57
|
+
}
|
|
58
|
+
export async function runUninstallUpdate(opts) {
|
|
59
|
+
const config = await loadConfig();
|
|
60
|
+
const projectId = id(opts.project, '--project');
|
|
61
|
+
const formId = id(opts.form, '--form');
|
|
62
|
+
const patch = await jsonFile(opts.patch, '--patch');
|
|
63
|
+
// Without --expected-updated-at the patch applies to the survey as it is now: read it first.
|
|
64
|
+
const expectedUpdatedAt = opts.expectedUpdatedAt ??
|
|
65
|
+
(await projectRequest(config, 'uninstallFeedback.agentGetForm', { projectId, formId })).form
|
|
66
|
+
?.updatedAt;
|
|
67
|
+
const result = await projectRequest(config, 'uninstallFeedback.agentUpdateForm', {
|
|
68
|
+
projectId,
|
|
69
|
+
formId,
|
|
70
|
+
patch,
|
|
71
|
+
dryRun: opts.dryRun === true,
|
|
72
|
+
...(expectedUpdatedAt ? { expectedUpdatedAt } : {}),
|
|
73
|
+
idempotencyKey: opts.idempotencyKey ?? randomUUID(),
|
|
74
|
+
confirmPrivacyChange: opts.confirmPrivacyChange === true,
|
|
75
|
+
proposedBy: opts.proposedBy ?? 'extenshi-cli',
|
|
76
|
+
}, true);
|
|
77
|
+
print(result);
|
|
78
|
+
const changes = Array.isArray(result.changes) ? result.changes.length : 0;
|
|
79
|
+
const stale = Array.isArray(result.staleTranslations) ? result.staleTranslations : [];
|
|
80
|
+
process.stderr.write(`${result.dryRun ? 'Dry run: would change' : result.unchanged ? 'Nothing to change:' : 'Changed'} ${changes} field(s). URL unchanged: ${String(result.url)}\n`);
|
|
81
|
+
if (stale.length)
|
|
82
|
+
process.stderr.write(`Translations to redo: ${stale.map((s) => `${s.locale} (${s.paths.join(', ')})`).join('; ')}\n`);
|
|
83
|
+
for (const warning of Array.isArray(result.warnings) ? result.warnings : [])
|
|
84
|
+
process.stderr.write(`Warning: ${String(warning)}\n`);
|
|
85
|
+
return result;
|
|
86
|
+
}
|
|
87
|
+
export async function runUninstallPreview(opts) {
|
|
88
|
+
const result = await projectRequest(await loadConfig(), 'uninstallFeedback.agentPreviewForm', {
|
|
89
|
+
projectId: id(opts.project, '--project'),
|
|
90
|
+
formId: id(opts.form, '--form'),
|
|
91
|
+
...(opts.locale ? { locale: opts.locale } : {}),
|
|
92
|
+
});
|
|
93
|
+
print(result);
|
|
94
|
+
return result;
|
|
95
|
+
}
|
|
96
|
+
export async function runUninstallTranslationsGet(opts) {
|
|
97
|
+
const result = await projectRequest(await loadConfig(), 'agentGetPageTranslations', {
|
|
98
|
+
projectId: id(opts.project, '--project'),
|
|
99
|
+
});
|
|
100
|
+
const pages = (Array.isArray(result.pages) ? result.pages : []).filter((p) => p.surface === 'uninstall' && (!opts.code || p.publicCode === opts.code));
|
|
101
|
+
print({ pages });
|
|
102
|
+
return { pages };
|
|
103
|
+
}
|
|
104
|
+
export async function runUninstallTranslationsSet(opts) {
|
|
105
|
+
const translations = await jsonFile(opts.file, '--file');
|
|
106
|
+
for (const [path, text] of Object.entries(translations))
|
|
107
|
+
if (typeof text !== 'string')
|
|
108
|
+
throw new InvalidInputError(`--file: "${path}" must map to a string`);
|
|
109
|
+
const result = await projectRequest(await loadConfig(), 'agentSetPageTranslations', {
|
|
110
|
+
projectId: id(opts.project, '--project'),
|
|
111
|
+
surface: 'uninstall',
|
|
112
|
+
publicCode: opts.code,
|
|
113
|
+
locale: opts.locale,
|
|
114
|
+
translations,
|
|
115
|
+
proposedBy: opts.proposedBy ?? 'extenshi-cli',
|
|
116
|
+
}, true);
|
|
117
|
+
print(result);
|
|
118
|
+
return result;
|
|
119
|
+
}
|
|
120
|
+
export async function runBrandMentions(terms, opts) {
|
|
121
|
+
if (!terms.length)
|
|
122
|
+
throw new InvalidInputError('Pass at least one name to look for');
|
|
123
|
+
const result = await projectRequest(await loadConfig(), 'agentFindBrandMentions', {
|
|
124
|
+
projectId: id(opts.project, '--project'),
|
|
125
|
+
terms,
|
|
126
|
+
});
|
|
127
|
+
print(result);
|
|
128
|
+
process.stderr.write(`${String(result.total)} mention(s) in ${result.searched?.join(', ') || 'no surfaces'}.` +
|
|
129
|
+
`${result.skipped?.length ? ` Not searched without pay.read: ${result.skipped.join(', ')}.` : ''}\n`);
|
|
130
|
+
return result;
|
|
131
|
+
}
|
|
132
|
+
export function registerUninstallCommands(program, run) {
|
|
133
|
+
const uninstall = program
|
|
134
|
+
.command('uninstall')
|
|
135
|
+
.description('The hosted uninstall survey (uninstall-form.extenshi.io): read, preview and change an existing survey, ' +
|
|
136
|
+
'and its translations. The URL and responses never change. Requires an API key (extenshi login).');
|
|
137
|
+
uninstall
|
|
138
|
+
.command('list')
|
|
139
|
+
.description('List the project surveys: URL, enabled, primary, response count')
|
|
140
|
+
.requiredOption('--project <id>', 'Dojo project ID (UUID)')
|
|
141
|
+
.action(async (opts) => run('uninstall list', async () => void (await runUninstallList(opts))));
|
|
142
|
+
uninstall
|
|
143
|
+
.command('get')
|
|
144
|
+
.description('One survey in full, its updatedAt, the heading and its source, translation status')
|
|
145
|
+
.requiredOption('--project <id>', 'Dojo project ID (UUID)')
|
|
146
|
+
.requiredOption('--form <id>', 'Survey ID (from uninstall list)')
|
|
147
|
+
.action(async (opts) => run('uninstall get', async () => void (await runUninstallGet(opts))));
|
|
148
|
+
uninstall
|
|
149
|
+
.command('update')
|
|
150
|
+
.description('Apply a partial patch (JSON: headline, thankYouMessage, reasons, customReasons, askComment, askContact, ' +
|
|
151
|
+
'winbackUrl, winbackLabel, reasonOutcomes, reasonFollowups, enabled, name; null clears a text). ' +
|
|
152
|
+
'Checked like the Dojo editor; prints the diff and the translations left outdated. Requires hosted.write.')
|
|
153
|
+
.requiredOption('--project <id>', 'Dojo project ID (UUID)')
|
|
154
|
+
.requiredOption('--form <id>', 'Survey ID (from uninstall list)')
|
|
155
|
+
.requiredOption('--patch <patch.json>', 'Partial survey JSON')
|
|
156
|
+
.option('--dry-run', 'Show the diff without saving')
|
|
157
|
+
.option('--expected-updated-at <iso>', 'Refuse when the survey changed since this updatedAt (default: read now)')
|
|
158
|
+
.option('--idempotency-key <uuid>', 'Reuse to retry the same write safely (default: a new key)')
|
|
159
|
+
.option('--confirm-privacy-change', 'Confirm your privacy policy covers emails collected by the survey')
|
|
160
|
+
.option('--proposed-by <label>', 'Label shown to the owner in Dojo (default: extenshi-cli)')
|
|
161
|
+
.action(async (opts) => run('uninstall update', async () => void (await runUninstallUpdate(opts))));
|
|
162
|
+
uninstall
|
|
163
|
+
.command('preview')
|
|
164
|
+
.description('The survey text in one language and the screen after each answer; counts nothing')
|
|
165
|
+
.requiredOption('--project <id>', 'Dojo project ID (UUID)')
|
|
166
|
+
.requiredOption('--form <id>', 'Survey ID (from uninstall list)')
|
|
167
|
+
.option('--locale <locale>', 'Language to render (default: the project language)')
|
|
168
|
+
.action(async (opts) => run('uninstall preview', async () => void (await runUninstallPreview(opts))));
|
|
169
|
+
const translations = uninstall
|
|
170
|
+
.command('translations')
|
|
171
|
+
.description('Translations of the developer-written text');
|
|
172
|
+
translations
|
|
173
|
+
.command('get')
|
|
174
|
+
.description('Translatable fields and per-language status of the project surveys')
|
|
175
|
+
.requiredOption('--project <id>', 'Dojo project ID (UUID)')
|
|
176
|
+
.option('--code <publicCode>', 'Only this survey')
|
|
177
|
+
.action(async (opts) => run('uninstall translations get', async () => void (await runUninstallTranslationsGet(opts))));
|
|
178
|
+
translations
|
|
179
|
+
.command('set')
|
|
180
|
+
.description('Save one language: --file maps field paths (from translations get) to text. Requires hosted.write.')
|
|
181
|
+
.requiredOption('--project <id>', 'Dojo project ID (UUID)')
|
|
182
|
+
.requiredOption('--code <publicCode>', 'Survey public code')
|
|
183
|
+
.requiredOption('--locale <locale>', 'BCP 47 tag, e.g. de or pt-BR')
|
|
184
|
+
.requiredOption('--file <translations.json>', '{"headline": "…", "thankYouMessage": "…"}')
|
|
185
|
+
.option('--proposed-by <label>', 'Label shown to the owner in Dojo (default: extenshi-cli)')
|
|
186
|
+
.action(async (opts) => run('uninstall translations set', async () => void (await runUninstallTranslationsSet(opts))));
|
|
187
|
+
program
|
|
188
|
+
.command('brand-mentions <names...>')
|
|
189
|
+
.description('Find every hosted field (surveys, welcome and instructions pages, homepage, privacy policy; license ' +
|
|
190
|
+
'terms and offers with pay.read) that still holds a name, with the command or tool that fixes it.')
|
|
191
|
+
.requiredOption('--project <id>', 'Dojo project ID (UUID)')
|
|
192
|
+
.action(async (names, opts) => run('brand-mentions', async () => void (await runBrandMentions(names, opts))));
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=uninstall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../src/uninstall.ts"],"names":[],"mappings":"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"}
|